2014-06-25 4 views
10

Ich schreibe eine kleine XML-Transformationsebene in Java. Ich empfange XML über Web-Service, modifiziere es und sende dann das modifizierte XML an ein anderes System. Ich warte dann auf eine Antwort und gebe die Antwort an den ursprünglichen Anrufer zurück.Log4J RollingFileAppender Kann nicht rollen Datei

Ich möchte die Anfrage, die ich erhalte, die Anfrage, die ich sende, die Antwort, die ich erhalte, und die Anfrage, die ich sende, protokollieren. Im Grunde möchte ich das Xml, wo jeder Pfeil in meinem Diagramm ist, protokollieren.

Mein Problem ist mit dem RollingFileAppender. Ich versuche, mit 10 MB zu rollen, manchmal tut es und manchmal rollt es nicht. Wenn es ein paar Mal rollt und dann stoppt, werden die gerollten Dateien weiterhin von 3 zu 4 und von 4 zu 5 usw. umbenannt.

Meine beste Vermutung ist, dass wenn die 10MB Markierung überschritten wird, mehrere Threads in die Protokolldatei geschrieben werden, so dass die Datei nicht umbenannt werden kann. Ich hoffe, dass Log4J dafür eine einfache Lösung bietet, aber wenn nötig, bin ich offen für den Wechsel zu einem neuen Logging-Framework. Vielen Dank im Voraus für jede Hilfe.

BEARBEITEN Hier ist meine Eigenschaftendatei.

log4j.rootLogger=DEBUG, fileOut 

log4j.appender.fileOut=org.apache.log4j.RollingFileAppender 
log4j.appender.fileOut.File=/logs/log.log 
log4j.appender.fileOut.layout=org.apache.log4j.PatternLayout 
log4j.appender.fileOut.layout.ConversionPattern=%d %-5p %c - %m%n 
log4j.appender.fileOut.MaxFileSize=10MB 
log4j.appender.fileOut.MaxBackupIndex=10 
log4j.appender.fileOut.append=true 

EDIT 2 Dies ist im Wesentlichen eine Beule, wie dieser Beitrag nur eine geringe Anzahl von Ansichten hat. Ich denke, das kann kein einzigartiges Problem sein. Jede Hilfe wird sehr geschätzt. Vielen Dank!

Antwort

9

Log4J initialisiert sich auf Klassenladeebene. Innerhalb eines bestimmten Klassenladers und seiner Vorfahren kann Log4J nur einmal initialisiert werden und die gleiche Log4J-Konfiguration gilt für alle Log4J-Aufrufe innerhalb des Klassenladers.

Solange alle Protokollierungsaufrufe innerhalb desselben Log4J-Konfigurationsbereichs ausgeführt werden, kann Log4J den Zugriff auf die physische Datei synchronisieren, auf die die Rolling Appender-Konfiguration verweist. Wenn die Zeit zum Rollen kommt, wird das Rollen ohne Probleme durchgeführt.

Problematisch wird es, wenn Sie zwei (oder mehr) Log4J "Konfigurations-Realms" verwenden, die dieselbe physische Datei für die Rolling Appender-Konfiguration verwenden. Das könnte sein:

  1. Zwei verschiedene Web-Anwendungen auf demselben physischen JVM
  2. zwei verschiedene Web-Anwendungen auf zwei verschiedene JVMs
  3. Gleiche Web-Anwendung horizontal gruppierte auf zwei verschiedenen JVMs

(etc)

Log4J hat einfach keine Möglichkeit zu wissen, wer sonst, außer sich innerhalb der gleichen Log4J Konfigurationsbereich, verwendet diese Datei. Am Ende wird Log4J auf System A versuchen, die Datei zu rollen (weil es denkt, dass keine anderen Prozesse auf diese Datei zugreifen), und schlägt fehl, weil jemand auf System B die Datei zur gleichen Zeit verwendet. Dies ist eine bekannte Einschränkung der Verwendung von Dateiappendenten, und Sie können Log4J dafür nicht wirklich verantwortlich machen: Log4J hat einfach nicht die Mittel, um zu überwachen, wer anders als Log4J in demselben "Konfigurationsbereich" ist Verwenden Sie diese Datei.

Für ein solches Anwendungsszenario können Sie den Log4J Socket Appender verwenden.

Wenn Ihr Szenario nicht mehrere Log4J "Konfigurations-Realms" umfasst, dann versuchen Sie, -Dlog4j.debug=true zu den JVM-Parametern hinzuzufügen und zu sehen, was genau während der Datei-Rolling-Operation vor sich geht.

+0

Vielen Dank für die ausführliche Erklärung. Ich sehe, was ich falsch gemacht habe und wie ich es in Zukunft vermeiden kann. Ich wusste, dass es nicht Log4Js Schuld sein konnte! – Joe

+0

@Joe, wenn es irgendeine Hilfe ist, wusste auch ich, dass es nicht Log4J's Fehler sein konnte ... – Isaac

+0

@Isaac können Sie mir sagen, welche "JVM-Parameter" sollte ich diese Zeile '-Dlog4j.debug = true' hinzufügen ? –

1

Ich sah auch das gleiche Problem in meiner Anwendung.

Dank @Isaac festgestellt, dass ich DOMConfigurator.configure für die gleiche Protokollkonfiguration in 2 Webanwendungen im Anwendungsserver bereitgestellt wurde. Ich habe einen von ihnen kommentiert und rollte wie erwartet.

1

Für andere, die hier ankommen, überprüfen Sie, dass Sie RollingFileAppender NOT FileAppender verwenden!

Ausschneiden und Einfügen Fehler sind zu einfach, für mich zumindest.

+2

Warum fügen Sie einen Kommentar ein Jahr nach der Beantwortung der Frage hinzu? Ich zeige deutlich, dass ich den RollingFileAppender verwende. – Joe

+0

Es war für Leute wie mich, die eine Antwort auf ein obskures technisches Problem suchen, wenn sie wirklich nur einen dummen Fehler gemacht haben. –

Verwandte Themen