steff aka sId
Erfahrenes Mitglied
Hi ich habe folgende Classe die ich zum loggen von Fehlern und Debug Messages nutzen möchte. Das ganze ist eine Art Singleton implementierung wobei es durch aus mehrere Objekte geben kann und zwar für verschiedene Module die in unterschiedliche Dateien schreiben sollen. Um dies zu realisieren schreibe ich den Filename als key in einen Hashtable bei dem ich dann das Object des AppLoggers hinterlege. Das funktioniert an sich auch ganz gut. Das Problem ist. Das wenn ich an zwei verschiedenen Stellen ein gleiches object Abrufe. Dann wird nix in die Datei geschrieben.
z.B. in der Gui hole ich mit mit getAppLogger("Error"); nen Error Logger der dann in die Error.log schreiben soll und das gleiche mache ich an einer anderen Stelle im Fachnkonzept auch.
Hier mein Code:
Viele Grüße und ich hoffe es kann mir wer weiterhelfen. Steffen
z.B. in der Gui hole ich mit mit getAppLogger("Error"); nen Error Logger der dann in die Error.log schreiben soll und das gleiche mache ich an einer anderen Stelle im Fachnkonzept auch.
Hier mein Code:
Code:
package Concept;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.GregorianCalendar;
import java.util.Hashtable;
public class AppLogger {
private String strFilename = null;
private BufferedWriter objWriter;
public static final int LOG_INFO = -1;
public static final int LOG_DEBUG = 0;
public static final int LOG_ERROR = 1;
private boolean logAll = true;
private boolean blnAppend = true;
private static Hashtable objAppLogger = null;
/**
* Private constructor cause of singleton implementation
*
* @param strFilename the filename to the log file
*/
private AppLogger(String strFilename) {
this.strFilename = strFilename;
// initalize filewriter
try {
this.objWriter = new BufferedWriter(new FileWriter("Logs"+File.separator+this.strFilename, this.blnAppend ));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Method to write a log entry. With the second parameter you can select
* what messag type will be logged. So you can log everything when you are
* when you are developing and log only errors when system goes to the
* customer. You have only to change the boolean flag. logAll to false;
*
* @param strMessage
* @param intLogLevel
*/
public synchronized void Log(String strMessage, int intLogLevel) {
// Check if all will be logged or only errors
if (this.logAll || LOG_ERROR == intLogLevel) {
String strLogMessage = "";
// Show the log level in the logfile
switch (intLogLevel) {
case LOG_INFO:
strLogMessage = "INFO - "; break;
case LOG_DEBUG:
strLogMessage = "DEBUG - "; break;
case LOG_ERROR:
strLogMessage = "ERROR - "; break;
}
// Get current date to log when the message was written
GregorianCalendar currDate = new GregorianCalendar();
currDate.setTimeInMillis(System.currentTimeMillis());
strLogMessage += currDate.getTime().toString() + ": " + strMessage;
try {
this.objWriter.write(strLogMessage);
this.objWriter.newLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* @param strFilename must be set without file extension
* @return the object for the given filename
* TODO Funktion Debuggen
*/
public static AppLogger getAppLogger(String strFilename) {
// if not inialized. Inialize Hashtable
if (null == objAppLogger) {
objAppLogger = new Hashtable();
}
// When not in Hashtable create a new object with the filename given as key
if(!objAppLogger.containsKey(strFilename)) {
objAppLogger.put(strFilename, new AppLogger(strFilename+".log"));
}
return (AppLogger)objAppLogger.get(strFilename);
}
public boolean isLogAll() {
return logAll;
}
public void setLogAll(boolean logAll) {
this.logAll = logAll;
}
public boolean isBlnAppend() {
return blnAppend;
}
public void setBlnAppend(boolean blnAppend) {
this.blnAppend = blnAppend;
}
}
Viele Grüße und ich hoffe es kann mir wer weiterhelfen. Steffen