Zuerst etwas Hintergrund. Ich habe einen Batch-Java-Prozess von einem DOS-Batch-Skript ausgeführt. Die gesamte Java-Protokollierung wird auf "stdout" gesetzt und das Stapel-Skript leitet die stdout-Datei in eine Datei um. (Dies ist gut für mich, weil ich ECHO aus dem Skript kann und es in die Protokolldatei gelangt, so dass ich alle Java-JVM-Befehlszeilenargumente sehen kann, was großartig für das Debugging ist.) Ich darf nicht
Ich benutze slf4j API, und für das Backend habe ich log4j verwendet, aber kürzlich zu logback-classic gewechselt.
Obwohl mein gesamter Anwendungscode slf4j verwendet, habe ich eine Bibliothek von Drittanbietern, die ihre eigene Protokollierung durchführt (ohne eine Standard-API zu verwenden), die ebenfalls in stdout geschrieben wird.
Das Problem ist, dass manchmal Log-Zeilen durcheinander geraten und nicht sauber in separaten Zeilen erscheinen. Hier ist ein Beispiel für eine vermasselte Ausgabe:
%Vor%Bei einem Vergleich mit älteren Protokolldateien scheint das Problem bei der Verwendung von log4j als Protokollierungs-Backend nicht aufgetreten zu sein. Logback muss also etwas anderes machen.
Das Problem scheint zu sein, dass PrintStream.write(byte buf[], int off, int len)
zwar synchronisiert ist, aber ich kann in% sehen. co_de% ist die einzige Schreibmethode namens.
Da zwischen dem Logback jedes Byte ausgegeben wird, kann die ThirdParty-Bibliothek eine ganze Zeichenfolge in den Stdout schreiben. (Das ist nicht nur ein Problem, sondern auch ein wenig ineffizient?)
Gibt es eine andere Lösung für dieses Interleaving-Problem, als den Code an ConsoleTarget zu patchen, damit er die anderen Schreibmethoden unterstützt? Irgendwelche netten Arbeitsumgebungen. Oder sollte ich einfach einen Fehlerbericht einreichen?
Hier ist meine logback.xml:
%Vor%Ich benutze Logback 0.9.20 mit Java 1.6.0_07.
In diesem Fall würde ich System.setOut (PrintStream out) für die angegebene 3rd-Party-Lib, die sich nicht verhält, durchlaufen. Implementieren Sie einen Thread, der diesen Protokollstrom lesen würde, teilen Sie ihn mit einer neuen Zeile und spucken Sie ihn in die Protokollierungslösung, die Sie verwenden. Sei nur vorsichtig, nicht zu lesen und auf den gleichen Thread zu schreiben :-) Das ist was du tust:
Du hast dir ein hübsches Protokoll besorgt, das mehr oder weniger synchron mit dem ist, was im System passiert
Offenbar haben Sie zwei verschiedene Protokollkonfigurationen, die in STDOUT
schreiben. Das Muster dieser beiden scheint sehr unterschiedlich zu sein, wenn man versucht, das Chaos zu entschlüsseln:
Die zweite Zeile scheint das Standardmuster anstelle Ihrer Definition zu verwenden. Wird irgendwo ein Logger geladen, der anstelle der XML-Konfiguration die Standardkonfiguration verwendet?