log-back und drittes Schreiben auf stdout. Wie man sie davon abhält, verschachtelt zu werden

8

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.

    
David Roussel 04.06.2010, 14:07
quelle

3 Antworten

2

Am Ende war die Behebung des zugrunde liegenden Problems einfacher als jede Umgehungslösung.

Patch für das Update: Ссылка

Bug-Raise in logback jira: Ссылка

    
David Roussel 11.06.2010, 14:22
quelle
2

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:

  • Sie erhalten den System.out-Stream zur Seite
  • Sie konfigurieren Ihren Logger für die Verwendung dieses Streams, siehe OutputStreamAppender
  • Sie erstellen einen Thread, der einen Stream ableitet, den Sie als neues System.out zuweisen (Ihre 3rd-Party-Bibliothek schreibt dort) und eine gut formatierte Ausgabe an das Protokoll sendet

Du hast dir ein hübsches Protokoll besorgt, das mehr oder weniger synchron mit dem ist, was im System passiert

    
Boris Daich 06.06.2010 22:54
quelle
0

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:

%Vor%

Die zweite Zeile scheint das Standardmuster anstelle Ihrer Definition zu verwenden. Wird irgendwo ein Logger geladen, der anstelle der XML-Konfiguration die Standardkonfiguration verwendet?

    
Marc 06.06.2010 12:41
quelle

Tags und Links