Effizienzsteigerung von FileWriter als Logging

garstig

Mitglied
Hallo liebe community!

Ich habe ein etwas größeres Programm geschrieben das 19 (derzeit) Objekte verwaltet (Files sortieren und verschieben, Kontrollmechanismen zum Filtern von Dateien) Im Leerlauf, also wenn keine Dateien für die einzelnen Objekte zum einsortieren sind, braucht das Programm ohne Logging Funktion max. 1 Min zum terminieren. Mit der Logging funktion, wo in den verschiedenen Klassen an verschiedenen Stellen, die statische write Funktion meiner LoggerKlasse aufgerufen wird, braucht das Programm im Leerlauf an die 6 Minuten.
Jetzt habe ich mir gedacht, ich sammle alle Logs eines Objektes in der LoggerKlasse und wenn ein Objekt abgearbeitet wurde, sage ich einfach flush und close (Objekte werden nacheinander abgearbeitet). Naja um mein Problem näher beschreiben zu können poste ich einfach mal die paar Zeilen Code die meine Logger-Klasse ausmachen.

Java:
public class MsgLog {
     protected static String defaultLogFile = "msglog.txt";
    
         public static void write(String s){
         try {
			write(defaultLogFile, s);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
     }
    
         public static void write(String f, String s) throws IOException {
         TimeZone tz = TimeZone.getTimeZone("CET");
         Date now = new Date();
         DateFormat df = new SimpleDateFormat ("dd.MM.yyyy HH:mm:ss ");
         df.setTimeZone(tz);
         String currentTime = df.format(now);
        
         FileWriter aWriter = new FileWriter(f, true);
         aWriter.write(currentTime + " " + s + "\n");
         aWriter.flush();
         aWriter.close();
     }
 }

Wie ihr seht, habe ich zu jeder Logmessage die an den Logger geschickt wird einen sekundengenauen Zeitstempel. Das würde beim Bündeln so abhanden kommen. Wie kann ich das am gescheitesten machen? Würde das überhaupt etwas ausmachen? Ich würde gerne wissen, wo beim FileWriter soviel Zeitaufwand aufkommt.

Danke jedenfalls fürs lesen, noch mehr Dank wenn ihr darüber nachdenkt und mir hilfreiche Gedankenanstöße gebt!
 

Marco13

Top Contributor
Ein BufferedWriter könnte schonmal ein bißchen helfen, aber ich bin nicht sicher, ob ich das richtig verstanden habe. Bist du sicher, dass das eigentliche Rausschreiben das teure ist, und nicht z.B. das bauen der Strings? Grundsätzlich könnte man GANZ GROB sowas machen, dass man alle Log-Messages (so, wie sie jetzt rausgeschrieben werden - also mit Zeitstempel) in einer Liste sammelt, und irgendwann am Stück rausschreibt, aber ob das der Weisheit letzter Schluss ist....!?
 

Lumaraf

Bekanntes Mitglied
Ich würde sagen das Problem ist das für jeden einzelnen Logeintrag die Datei geöffnet werden muß. Die Logdatei nur einmal zu öffnen sollte könnte da schon einen guten Geschwindigkeitsgewinn geben. Dann solltest du am besten dem System auch die Chance geben die Daten etwas zu puffern indem du nicht nach jedem Eintrag ein flush aufrufst. Das braucht auch seine Zeit.
 

garstig

Mitglied
Ja, danke für eure Anregungen, es war genau das was ich mir auch schon grob vorgestellt habe. :) So sieht jetzt der Code aus,
Java:
public class MsgLog {
	protected static String defaultLogFile = "msglog.txt";
	static String logbundle = "";
	
	public static void write(String s){
		TimeZone tz = TimeZone.getTimeZone("CET"); // or PST, MID, etc ...
		Date now = new Date();
		DateFormat df = new SimpleDateFormat ("dd.MM.yyyy HH:mm:ss ");
		df.setTimeZone(tz);
		String currentTime = df.format(now);
		
		logbundle = logbundle + currentTime + " " + s + "\n";
	}

	public static void write(String f, String s) throws IOException {

		FileWriter aWriter = new FileWriter(defaultLogFile, true);
		aWriter.write(s);
		aWriter.flush();
		aWriter.close();
	}

	public static void flush(){
		try {
			write(defaultLogFile, logbundle);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
´

Die Methode flush() wird im Code zweimal erwähnt, einmal gegen Ende des Codes und ein weiteres Mal in der Schleife der einzelnen Objekte, damit nichts verloren geht. Ich habe allerdings noch eine Frage hierzu: die Methode flush() wird in der Main Methode aufgerufen, wenn jetzt in einer der anderen Klassen eine Exception vorkommt, die in den Log schreibt oder generell wenn im Stream noch Strings sind die nicht "geflushed" wurden und eine Exception vorkommt, gehen dann diese Strings verloren? Wie kann ich dem vorbeugen? Würde ein finally in der MainMethode reichen oder sollte ich jetzt wieder in jedem Exception handling flush() aufrufen?
 

KrokoDiehl

Top Contributor
Klingt nach einem typischen Fall für finally, weil das immer ausgeführt wird.

Eines noch: Für String-Arbeiten würde ich den StringBuilder nehmen, weil String+String durchaus ineffizient sein kann. Deine Globale
Code:
logbundle
würde ich also zum StringBuilder machen. Wer weiß, vielliecht gewinnst du noch ein paar Millisekunden ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D FileWriter / FileReader Problem Java Basics - Anfänger-Themen 10
A Datei Ein und Ausgabe FileWriter und printWriter Java Basics - Anfänger-Themen 5
O Ausgabe als .txt Datei speichern mit FileWriter Java Basics - Anfänger-Themen 2
B FileWriter nicht sichtbar? Java Basics - Anfänger-Themen 4
D Methoden Filewriter macht keine Zeilenumbrüche Java Basics - Anfänger-Themen 3
D FileWriter schreibt nicht in Datei Java Basics - Anfänger-Themen 14
Z FileWriter erzeugt Symbole Java Basics - Anfänger-Themen 8
C FileWriter bzw. Reader fehlerhaft Java Basics - Anfänger-Themen 6
C FileWriter Problem. Java Basics - Anfänger-Themen 2
M FileWriter Neue Datei wenn aktuelle "zu groß" Java Basics - Anfänger-Themen 3
D Nur aus Interesse: Warum verwendet man FileWriter.flush()? Java Basics - Anfänger-Themen 4
B FileWriter und JFileChooser zusammenfügen Java Basics - Anfänger-Themen 3
B FileWriter close() muss? Java Basics - Anfänger-Themen 8
Java-Insel Methoden FileWriter Methoden funktionieren nicht Java Basics - Anfänger-Themen 20
D Erste Schritte Warum try-catch für FileWriter Java Basics - Anfänger-Themen 5
L FileReader und Filewriter Java Basics - Anfänger-Themen 4
O Datentypen double in string über fileWriter... Java Basics - Anfänger-Themen 7
O OOP fileWriter Dateiname übergeben Java Basics - Anfänger-Themen 12
R Klassen FileWriter und CharSet Java Basics - Anfänger-Themen 4
Luk10 FileWriter Java Basics - Anfänger-Themen 6
W Problem mit FileWriter / ActionListener Java Basics - Anfänger-Themen 6
O Integer in File mit Filewriter schreiben - geht nicht richtig Java Basics - Anfänger-Themen 4
M Probleme mit FileWriter Java Basics - Anfänger-Themen 7
M FileWriter innerhalb runnable Jar Java Basics - Anfänger-Themen 8
Burny91 FileReader / FileWriter / BufferedWriter An einer bestimmten Zeile String ersetzten Java Basics - Anfänger-Themen 2
C FileWriter mit einer Variable Java Basics - Anfänger-Themen 8
S FileWriter - in neue Zeile schreiben!? Java Basics - Anfänger-Themen 19
K FileWriter Speicherort Java Basics - Anfänger-Themen 7
T OOP Speichern mit BufferedWriter(FileWriter(File)) Java Basics - Anfänger-Themen 2
S FileWriter Java Basics - Anfänger-Themen 3
S Filewriter schreibt einfach nicht Java Basics - Anfänger-Themen 6
G FileWriter -> neue Zeile Java Basics - Anfänger-Themen 13
F Seltsame Zeichen und kein Zeichenumbruch mit Filewriter Java Basics - Anfänger-Themen 4
G FileWriter Java Basics - Anfänger-Themen 3
G FileWriter Java Basics - Anfänger-Themen 6
T FileWriter Java Basics - Anfänger-Themen 5
M FileWriter Java Basics - Anfänger-Themen 18
J Problem mit FileWriter Java Basics - Anfänger-Themen 24
N Schneller als FileWriter? Java Basics - Anfänger-Themen 28
B Problem mit Filereader und filewriter Java Basics - Anfänger-Themen 20
M FileWriter-Problem Java Basics - Anfänger-Themen 2
P FileWriter schreiben? Java Basics - Anfänger-Themen 4
L Streamklassen, Filewriter und StringBuffer Java Basics - Anfänger-Themen 2
D FileWriter write? Zeilenumbruch ? Java Basics - Anfänger-Themen 4
G Prüfen mit FileWriter Java Basics - Anfänger-Themen 6
N Problem mit FileWriter Java Basics - Anfänger-Themen 2
S FileWriter-Variable nicht initialisiert Java Basics - Anfänger-Themen 3
R FileWriter: Dort wieder anfangen, wo er aufgehört hat Java Basics - Anfänger-Themen 4
S FileWriter funzt nicht :( Java Basics - Anfänger-Themen 5
J Logging erzeugt zwei dateien.... Java Basics - Anfänger-Themen 7
U Java logging generiert unerwünschten files Java Basics - Anfänger-Themen 1
S Logging Code komplett von Compiler entfernen lassen..? Java Basics - Anfänger-Themen 5
T executable jar und logging Java Basics - Anfänger-Themen 24
W Java Logging API Java Basics - Anfänger-Themen 4
C logging ubuntu Java Basics - Anfänger-Themen 4
M Logging Review Java Basics - Anfänger-Themen 6
K Frage zur Logging API Java Basics - Anfänger-Themen 5
M irc-chat logging Java Basics - Anfänger-Themen 14
D Logging sätmlicher Vorgänge, wie am besten realisieren? Java Basics - Anfänger-Themen 6
K Frage zu Exceptions -> Logging Java Basics - Anfänger-Themen 6
F Logging von Hibernate-Statements und Glassfish Java Basics - Anfänger-Themen 2
M logging mit log4j Java Basics - Anfänger-Themen 4
G Logging API von Sun Java Basics - Anfänger-Themen 4
G Logging-Ausgabe in einem Dialog Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben