2011-12-18 30 views
0

我需要在logs.but中輸入用戶名和客戶端IP地址。但用戶名僅在第四個線程中使用MDC在log4j.From下一個線程中打印爲空。任何人都可以建議如何進一步處理這一問題。在log4j中記錄用戶名

+0

1 - 你如何決定下一個線程?如果是下一個請求,它應該通過代碼將值放入MDC中的代碼。 請確保僅在請求/線程即將完成時才從MDC中刪除值。 – 2013-08-06 07:57:19

回答

1

MDC使用ThreadLocal來存儲值。也許Log4J(如Logback)使用InheritableThreadLocal,它部分地解決了像你這樣的問題:新創建的線程從父線程繼承MDC。我猜你正在使用某種池(我們很少在EE環境中創建專用線程,所以繼承MDC不僅沒有幫助,而且當池按需增長時可能會引起很多混淆)。不幸的是,在這種情況下,您需要在切換到新線程時明確設置MDC。更重要的是,你需要清理後,否則池線程將被舊的MDC「污染」。

例如,當從包含有效MDC值的Web線程發送JMS消息時,您必須添加所需的MDC值,例如,到消息標題中。然後,當您收到JMS消息(JMS中的線程),你需要手動retrive這個值,並把它們註冊:

public void onMessage(Message message) { 
    MDC.put("user", message.getStringProperty("user")); 
    try { 
     //handle the message 
    } finally { 
     MDC.clear(); 
    } 
} 

您必須執行每一個你的要求跳進一個不同的線程時間類似的註冊。再次 - 清理是非常重要的非常