2017-10-09 4 views
2

Ich habe diese Webapplikation, die ziemlich stark protokolliert. Wir haben für jeden anfordernden Thread einen Aufruf an MDC implementiert, um einen Benutzer in unseren Protokollen nachverfolgen zu können.Logging optionale Schlüsselwerte

A logmessage könnte wie folgt aussehen:

INFO [2017-10-09 10:10:55,841] user_uuid=123-123-123 com.myapp.SomeClass: Some log message... 

Das Problem ist jetzt, dass die meisten der Zeit, keine aktuellen Benutzer vorhanden ist, und wir haben keine Verwendung für das user_uuid Feld im Protokoll Beispiel oben. Also statt, wird es wie folgt aussehen:

INFO [2017-10-09 10:10:55,841] user_uuid= com.myapp.SomeClass: Some log message... 

Gibt es eine Möglichkeit, nicht die MDC Schlüssel & Wert in Protokoll schreiben, wenn es keine MDC-Wert ist? Einige Log-Formate habe ich noch nicht gefunden?

Ich mag es so aussehen, wenn kein MDC Wert gefunden wird:

INFO [2017-10-09 10:10:55,841] com.myapp.SomeClass: Some log message... 

Die oben (MDC) Beispiele sind wie so konfiguriert:

%-5p [%d{ISO8601,UTC}] user_uuid=%mdc{user_uuid:-} %c: %m%n%rEx 
+0

Sie können nur den vollständigen MDC anzeigen (dies erfordert natürlich, dass Sie nur wichtige Informationen dort speichern), dann würde nur der vorhandene Inhalt protokolliert. In Ihrem Beispiel haben Sie den 'user_uuid =' Part fest codiert, so dass Sie nirgendwohin gehen werden. – Kayaman

+0

Siehe https://stackoverflow.com/questions/24616745/how-to-conditional-add-text-from-mdc-on-a-log4j-pattern für ein Duplikat. – Kayaman

Antwort

1

Dieser Eintrag in Ihrem Muster ...

user_uuid=%mdc{user_uuid:-} 

... besteht aus zwei Teilen:

  1. Eine statische "Wurzel" (d. H. Auf der linken Seite der Zuweisung ist dies immer im Ausgang vorhanden. Die Entscheidung, dies zu berücksichtigen, wird getroffen, wenn Logback sich selbst initialisiert.

  2. Ein Wert (d. H. Die rechte Seite der Zuweisung), dies ist nur in der Ausgabe vorhanden, wenn das MDC-Attribut user_uuid aufgefüllt ist. Die Entscheidung, dies zu berücksichtigen, wird zur Laufzeit für jedes Log-Ereignis getroffen.

Wahrscheinlich sagen Sie nichts Neues gibt, aber der entscheidende Punkt ist, dass die Einbeziehung der linken Seite kann nicht durch eine bedingte Logik rückgängig gemacht werden, die anspringt, wenn jedes Protokollereignis von der Anwendung emittiert Auswertung. Logback's PatternLayoutBase durchläuft sein gegebenes Muster und jedes Mal, wenn es zu etwas bedingt oder ableitbar kommt, wertet es es aus und hängt den ausgewerteten Wert an das Muster an, durch das es läuft. Also, für dein Muster; Logback hat dem aktuellen StringBuilder bereits "user_uuid =" zugewiesen, bevor er überhaupt mit der Auswertung der MDC-Bedingung beginnt.

aber Sie konnte das Ziel gewünschte Ziel erreichen, indem die user_uuid MDC Attribut Bestücken mit: user_uuid=<the user id> und Sie dann Muster einfach die Anmeldung ändern, um den MDC-Wert anmelden, ohne die Zuordnung. Zum Beispiel:

%-5p [%d{ISO8601,UTC}] %mdc{user_uuid:-}%c: %m%n%rEx 

Mit diesem Muster anstelle dem folgende Protokoll Anrufungen ...

logger.info("Does this include the user_uuid?"); 
MDC.put("user_uuid", "user_uuid=me "); 
logger.info("Or does this include the user_uuid?"); 

...emittieren:

INFO [2017-10-09 11:15:22,420] com.stackoverflow.SomeClassTest: Does this include the user_uuid? 
INFO [2017-10-09 11:15:22,435] user_uuid=me com.stackoverflow.SomeClassTest: Or does this include the user_uuid? 

Obwohl das ein wenig umständlich ist, weil Sie ein Leerzeichen am Ende des MDC-Wertes und dieser user_uuid MDC-Wert ist nur sinnvoll für die Anmeldung in diesem speziellen Muster erinnern müssen umfassen (während einfach einschließlich der user_uuid - ohne die linke Seite und den Gleichheitsoperator - wäre allgemeiner nützlich).

Wenn diese Nachteile dieses Ansatzes unuseable für Sie machen dann denke ich, werden Sie in Logback die stecken bleiben müssen PatternLayoutBase oder FormattingConverter irgendeine Form von Look-Ahead oder einen Weg zur Änderung des in-progress Stringbuilder, wenn die rechte Hand zu implementieren Seite einer Zuweisung gibt einen leeren String zurück.

+0

Sehr umfassende Antwort! Vielen Dank :) Ich werde eine Art von Util-Klasse erstellen, um die MDC 'Put' Anrufe zu verwalten. (Was sie mit 'Schlüssel = ' einwickeln wird –