Problem mit Filewriter/ Bufferedwriter

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:
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
 
Hallo Steff,
ich hab mir jetzt den Quelltext nicht so genau angeschaut.
Aber ich sehe nirgends, das Du die Streams nach dem Schreiben wieder schließt.
Das kann natürlich zu Problemen führen, wenn Du mehrere Instanzen deines Loggers hast, die auf das gleiche File zugreifen. Ich würde erstmal dafür sorgen, das die Streams nach einem Log geschlossen werden, vielleicht hilft das ja!

Vielleicht kannst Du Dir auch mal die Bibliothek "log4J" anschauen, das ist ein feritger Logger für Java, damit kannst Du das eigentlich alles machen. :)
 
Hm ja daran hab ich auch schonmal gedacht. Allerdings hatte jede Instanz eingeltich auch ihre eigene Datei in die sie schreibt. Werd mal trotzdem nach ner Lösung überlegen.
Danke für deine Antworte und viel Grüße Steffen
 
Kein Problem,
wenns immer noch nicht klappt, schauen wir nochmal zusammen nach der Lösung, gehen muß das ja :-)

Schönen Abend noch.
 
Hehe habs gelöst :-) das Problem lag am BufferedWriter der hat seinen letzten Puffer nicht in die Datei geschrieben. Mit nem zusätzleichen Aufruf von Flush() war das ganze dann gelöst. Danke für die Hilfe viele Grüße Steffen
 
Zurück