2012-06-11 30 views
1

我的軟件中的任務涉及幾個步驟,其中每個步驟可能會或可能不會在不同的線程中執行。每個步驟都有一些日誌,我使用log4j作爲日誌服務。跨越多個線程的任務的日誌關聯

令人頭痛的問題是很難將由不同線程打印的日誌與它們所屬的任務相關聯。在單線程模式下,線程名稱是一個很好的指示器,但它不適用於多線程模式。我不想通過線程傳遞任務指示符,因爲它很煩人,並且會給程序員帶來負擔。

我不知道有人面臨同樣的問題,並有一個很好的解決方案?謝謝。

回答

1

在MDC(映射診斷上下文)和NDC(嵌套診斷上下文)上查找log4j's documentation。下面是從this article摘錄

嵌套診斷上下文(NDC)和映射診斷上下文(MDC)的情況下 幫助,其中一個應用程序參與同時 服務多個客戶端,並且您有興趣分離或 可區別記錄來自每個這些多個客戶端的內容。 Web 應用程序是這種情況的一個非常好的例子。

那麼我們如何分離或區分來自多個客戶端的內容呢?由 標記每個日誌語句與客戶特定的信息。這在典型的Web應用程序 中可以包括客戶端的IP地址(其中包括容器可用的IP地址)。因此,在NDC中,當 進入上下文時,您將此信息推入堆棧,並在離開該上下文時彈出。在寫入到appender時,log4j使用 這個特定於上下文的信息,如果在 與您的關聯佈局中使用了%x轉換模式。

0

有兩個類org.apache.log4j.MDC和org.apache.log4j.NDC是爲此目的而創建的。 只是指Javadocs:NDCMDC