2016-07-14 4 views
1

Ich arbeite an einem E-Commerce-Unternehmen j2ee Anwendung mit Spring-Framework, Jersey-Framework. Momentan protokollieren wir alle Transaktionen (Transaktionen, die durch den Konsum von Nachrichten aus der Warteschlange/über Web-Service-Anfragen erstellt wurden).Wie eine eindeutige ID für jede Transaktion mit Logback und slf4j zuweisen

Nehmen wir an, ich habe eine Nachricht, die bei der Verarbeitung in meiner Komponente fehlgeschlagen ist. Ich möchte alle Protokolle (alle Log-Level-Informationen, Debug, Fehler ...) für diese Transaktion erhalten. Momentan schaue ich mir den Thread-Namen an, um alle Protokolle für diese Transaktion zu bestimmen. Ich möchte mich nicht lange darauf verlassen, da es möglich ist, dass die Thread-Namen nach einem bestimmten Zeitpunkt gleich sein können.

2016-07-14 02: 45: 50.716 [DefaultMessageListenerContainer-3] DEBUG Someclass - someMethod1() - Methode Eintrag

2016-07-14 02: 45: 50.724 [DefaultMessageListenerContainer-3] SomeClass1 - someMethod2() Anzahl der Zeilen eingefügt: [1]

2016.07.14 02: 45: 50.724 [DefaultMessageListenerContainer-3] DEBUG Someclass - someMethod1() - Methode Beenden

Ist es möglich, dass ich Protokolle mit so etwas wie diese

2016-07-14 02 haben kann: 45: 50.716 [sometransactionnbr] [DefaultMessageListenerContainer-3] DEBUG Someclass - someMethod1() - Methode Eintrag

2016.07.14 02: 45: 50.724 [sometransactionnbr] [DefaultMessageListenerContainer-3] SomeClass1 - someMethod2() Anzahl der Zeilen eingefügt : [1]

2016.07.14 02: 45: 50.724 [sometransactionnbr] [Standard MessageListenerContainer-3] DEBUG Someclass - someMethod1() - Methode Ausfahrt

Wie kann das "sometransactionnbr" einfach ohne Code für jede Methode zu ändern hinzugefügt werden, die ich geschrieben habe?

Antwort

2

Leider gibt keine schnelle Änderung ist ...

Zuerst müssen Sie die Mapped Diagnostic Context (MDC) verwenden, setzen Sie Ihre transactionID. Diese Dienstprogrammklasse ermöglicht das Festlegen von Kontextinformationen, die sich auf den ausgeführten Vorgang beziehen (Sie können alle Informationen festlegen, mit denen Sie Protokolle besser überwachen können).

Idealerweise muss Ihre transansationID zu Beginn Ihrer Operation (Geschäftsmethode) festgelegt und am Ende entfernt werden. Nach der Konfiguration ist die transactionID für jedes protokollierte Ereignis verfügbar (selbst wenn diese Ereignisse von internen Methodenaufrufen protokolliert werden. Sie müssen diese Informationen also nicht an innere Methoden weitergeben ... der Logger verwaltet dies für Sie).

(Very Important: Die MDC verbindet den Kontext zu dem Thread, der die MDC.put() Methode führt ... so, wenn Sie Anwendungsserver-Threads (muss von ihnen tun) die Wiederverwendung und Sie reinigen den Kontext nicht richtig , protokollieren Sie Ereignisse mit veralteten Kontexten (die der vorherigen Ausführungen in demselben Thread) ...Außerdem wird der Kontext für einen Thread lokal sein. Wenn Sie also eine andere Methode aufrufen, die an einem anderen Thread ausgeführt wird, werden diese Kontextinformationen nicht übertragen !!! (In diesem Fall müssen Sie diese Informationen auf andere Weise weitergeben).

Zweitens müssen Sie Ihre Logger-Konfiguration modifizieren Kontextparameter zu Ihrem Muster schließen .... Beispiel:

%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] [%X{txID}] (%t) %m%n 

Wo% X Parameter aus dem MDC abzurufen.

Hope this help ...

UPDATE: Beispiel Verwendung ...

public class MyBusinessClass { 
    private static TxIDGenerator generator = new TxIDGenerator(); 
    ... 
    public void myBusinessMethod() { 
     String txID = generator.nextValue(); 
     MDC.put("txID", txID); 
     try { 
      businessStuffA(); 
      businessStuffB(); 
      ... 
      //some business stuff 
     } finally { 
      MDC.remove("txID"); 
     } 
    } 
} 
+0

I MDC sah vor, aber nicht glaube, dass der gesamte Thread Thread den gleichen Kontext verwendet. Und bezüglich der Wiederverwendung von Threads durch den Anwendungsserver ist das möglich. Ich habe dieselben Thread-Namen in Protokollen gesehen. Wie kann ich in einer solchen Situation mit dem Kontext umgehen? Wird sich der Wert ändern, da ich zu Beginn der Geschäftsmethode eine andere Transaktions-ID generiert habe? – daemon54

+1

@ daemon54 ... Ja, die txID wird immer geändert, wenn ein solcher Wert am Anfang der Geschäftsmethode gesetzt ist. Es ist jedoch immer eine gute Methode, diesen Wert mit der Methode 'MDC.remove()' am Ende der Geschäftsmethode innerhalb eines 'finally'-Blocks zu entfernen ... siehe mein Beispiel oben ... –

+0

Sweet. Das hilft. Vielen Dank. – daemon54

Verwandte Themen