2016-07-14 90 views
1

我正在使用Spring框架,Jersey框架的電子商務企業J2EE應用程序來分配每個事務的一個唯一的ID。目前我們正在記錄所有事務(通過消費隊列中的消息/通過Web服務請求創建的事務)。如何使用的logback和SLF4J

比方說,我在我的組件加工時失敗的消息。我想獲取該事務的所有日誌(所有日誌級別信息,調試,錯誤...)。目前我正在查看線程名稱以確定該事務的所有日誌。我不想長期依賴這個,因爲在特定的時間點之後線程名稱可能是相同的。

2016年7月14日02:45:50716 [使用DefaultMessageListenerContainer-3] DEBUG SomeClass的 - someMethod1() - 方法條目

2016年7月14日02:45:50724 [使用DefaultMessageListenerContainer-3] SomeClass1 - 插入的行someMethod2()編號:[1]

2016年7月14日02:45:50724 [使用DefaultMessageListenerContainer-3] DEBUG SomeClass的 - someMethod1() - 方法退出

是否有可能,我可以有日誌,像這樣的東西

2016年7月14日02:45:50716 [sometransactionnbr] [使用DefaultMessageListenerContainer-3] DEBUG SomeClass的 - someMethod1() - 方法入口

2016年7月14日02:45:50724 [sometransactionnbr] [使用DefaultMessageListenerContainer-3] SomeClass1 - someMethod2()插入的行數 :[1]

2016年7月14日02:45:50724 [sometransactionnbr] [默認MessageListenerContainer的-3] DEBUG SomeClass的 - someMethod1() - 方法退出

怎麼可以這樣 「sometransactionnbr」 很容易在不改變代碼,每次我都寫方法添加?

回答

2

可悲的是,沒有變化快......

首先,您需要使用映射診斷上下文(MDC),設置您TRANSACTIONID。此實用程序類允許設置與已執行操作相關的上下文信息(您可以設置任何有助於以更清晰的方式審覈日誌的信息)。

理想情況下,您的transansationID必須設置在您的操作(業務方法)的開始處並在最後刪除。之後進行配置,TRANSACTIONID可用於任何記錄的事件(即使這些事件是由內記錄的方法調用,所以你不需要通過這樣的信息,以內部方式...記錄器將負責管理這個給你)。

非常重要:民革聯繫上下文來執行的MDC.put()方法......所以,如果你的應用服務器重用線程(其中必須做)的線程,你不正確的清潔上下文,你將使用過時的上下文記錄事件(那些在同一個線程上執行的事件)...另外,上下文對於一個線程是本地的,所以如果你調用在另一個線程中執行的另一個方法,這樣的上下文信息將不會被傳送! (在這種情況下,您需要以另一種方式傳遞此類信息)。

其次,你必須修改記錄器的配置,包括這方面的參數,以你的方式....例:

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

凡%X檢索來自MDC參數。

希望這有助於...

UPDATE:示例使用...

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

我沒有看到之前MDC,但沒有想到的是整個線程的線程使用相同的背景。關於應用程序服務器重用線程,這是可能的。我在日誌裏看到了相同的線程名稱,在這種情況下我如何處理上下文。值會改變,因爲我在業務方法開始時生成了不同的事務ID? – daemon54

+1

@ daemon54 ...是的,如果在業務方法的開始處設置此值,txID將始終更改。然而,使用方法刪除這樣的值總是一個很好的習慣:在業務方法結尾處的'MDC.remove()','finally'塊內......參見上面的示例... –

+0

甜。這有幫助。謝謝。 – daemon54

相關問題