2009-08-06 20 views
5

Ich habe eine ältere PSVM-Anwendung, die ich ihre Logging-Ausgabe auf eindeutige Dateien pro Ausführung umleiten möchte. Also, wenn ich es um 10:00 Uhr aufrufe, dann lasse es seine Ausgabe nach {thread-id} -10: 00.log umleiten; und ein anderer Ausführungsthread kann eine Ausführung um 10:01 beginnen, und seine Ausgabe würde zu {thread-id} -10: 01.log gehen. Ich verstehe, dass das nicht elegant ist.dynamisch erstellen und zerstören Logging Appender

Meine Fragen sind:

  • ist das möglich?
  • hat jemand eine Idee, wie man sich nähert?
  • ist es möglich, einen Appender zu löschen/zu löschen, wenn er nicht mehr benötigt wird?

Vielen Dank!

Antwort

4

Ich würde mit FileAppender beginnen und davon ableiten, um Ihre eigenen zu erstellen. Ändern Sie einfach Ihre Version, um die aktuelle Thread-ID zu erhalten, und hängen Sie vor der Erstellung eine geeignete Thread-ID/Zeitmarke an die Datei an. Sie würden (sagen wir) eine Karte von (gepuffertem) FileWriters Keyed-Thread-ID pflegen.

Schreiben Appender ist ganz trivial - here's a Javaworld guide auf, wie es geht.

In den oben genannten, ist es wahrscheinlich, dass Ihr Programm zweimal in einer Minute startet? Möchten Sie eine Prozess-ID oder Ähnliches anhängen, um die Eindeutigkeit zu erhalten?

+0

danke für die schnelle antwort! es ist nicht der Fall für einen Thread, es mehr als einmal zu tun. Aber dies ist nur ein Beispiel für Diskussionszwecke. Der Name würde auf Eindeutigkeit beschränkt sein. Irgendwelche Ideen zum Freigeben des Dateischreibers? –

+0

+1 Gute Anleitung Link – WolfmanDragon

+0

Re. loslassen. Ich denke, Sie sollten den Writer nach jeder Log-Nachricht löschen (um das Schreiben auf die Festplatte zu gewährleisten), und sorgen Sie sich nicht um die Freigabe. Lassen Sie die JVM alles nehmen. Es sei denn, du schreibst viele Threads und hast viele Dateien geöffnet. Dann möchten Sie vielleicht nur "n" Writer auf einmal geöffnet halten und einige schließen, wenn Sie nicht eingeloggt sind. Das kann jedoch zu etwas Thrashing führen :-) –

1

Es ist nicht möglich, zumindest nicht einfach in log4j zu tun. Wenn Sie jedoch SiftingAppender Versand mit Logback (log4j-Nachfolger) betrachten, ist es so konzipiert, dass die Erstellung von Appendern nach Laufzeitkriterien sowie deren Entfernen, wenn sie nicht mehr benötigt werden, durchgeführt wird.

Wenn Ihre Anwendung nur eine Protokolldatei pro Anwendungsstart erstellen muss, können Sie Ihre Protokolldatei einfach anhand eines Zeitstempels benennen. Schreibe auf die Logbuch-Benutzer-Mailingliste, wenn du weitere Hilfe benötigst.

+0

Ich bin neugierig auf mehr Hintergrund, warum dies nicht möglich ist. Es scheint relativ einfach zu sein. Ich habe einen Beitrag zum Logbuch-Benutzer hinzugefügt. Ich hoffe, du kannst es dort finden und ausarbeiten. Vielen Dank! –

+0

Es hängt davon ab, ob Sie den benutzerdefinierten Appender programmgesteuert oder über eine Konfigurationsdatei konfigurieren möchten. Es gibt auch die Frage, Protokolldateien (eine pro Thread) in einer Multithread-Anwendung zu verwalten. Die ursprüngliche Frage war nicht sehr spezifisch in Bezug auf diese beiden Probleme. – Ceki

Verwandte Themen