Hi,
ich habe mir eine kleine Klasse geschrieben, die debug informationen in eine Datei schreibt. Diese habe ich statisch gemacht um einfacher von allen anderen Klassen darauf zugreifen zu können. Ich bin jetzt aber nicht sicher, ob diese wirklich Thread safe ist, da sie von vielen Threads gleichzeitig aufgerufen werden kann.
Eigentlich sollte sie das sein da sie nur lokale Variablen (Stackvariablen) ändert. Aber was passiert, wenn die write Methode von mehreren Threads gleichzeitig aufgerunfen wird? Kann es dann zu Problemen kommen ?
ich habe mir eine kleine Klasse geschrieben, die debug informationen in eine Datei schreibt. Diese habe ich statisch gemacht um einfacher von allen anderen Klassen darauf zugreifen zu können. Ich bin jetzt aber nicht sicher, ob diese wirklich Thread safe ist, da sie von vielen Threads gleichzeitig aufgerufen werden kann.
Eigentlich sollte sie das sein da sie nur lokale Variablen (Stackvariablen) ändert. Aber was passiert, wenn die write Methode von mehreren Threads gleichzeitig aufgerunfen wird? Kann es dann zu Problemen kommen ?
Code:
public final class Logger
{
private static String filename = null;
private static boolean verbose;
/**
* Init logging by creating file for actual day
*
* @param verb If true, all logger outputs are also streamed to the console.
* @return True on success, false on error
*/
public static boolean init(boolean verb)
{
verbose = verb;
String filePath = GlobalSettings.getPathForFile("logs");
if(filePath == null)
return false;
File directory = new File(filePath);
if (!directory.exists())
{
if(!directory.mkdir())
return false;
}
filename = GlobalSettings.getPathForFile("logs"+File.separator+ Util.sqlDateFromLocalDate(LocalDate.now())+".txt");
String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
filename = filePath+File.separator+today+".txt";
return true;
}
/**
* Write text to log
*
* @param string Text to write
*/
public static void log(String string)
{
Logger.write(string);
}
/**
* Write double to log
*
* @param value Double value to write to log
*/
@SuppressWarnings("unused")
public static void log(double value)
{
Logger.write(String.format("%f", value)); //$NON-NLS-1$
}
/**
* Write object to log
*
* @param object Object to write to log
*/
public static void log(Object object)
{
Logger.write(object.toString());
}
/**
* Write to log
*
* @param string Text to write
*/
private static void write(String string)
{
try
{
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd HH:mm:ss"); //$NON-NLS-1$
Calendar cal = Calendar.getInstance();
string=dateFormat.format(cal.getTime())+" "+string; //$NON-NLS-1$
FileWriter fw = new FileWriter(filename,true);
fw.write(string+System.getProperty("line.separator")); //$NON-NLS-1$
fw.close();
if(verbose)
System.out.println(string);
}
catch(IOException ioe)
{
System.err.println("IOException: " + ioe.getMessage()); //$NON-NLS-1$
}
}
}