2010-06-24 52 views

回答

6

您的列表可能會嘗試使用自定義的Log4j追加,這需要線程ID作爲參數,並篩選基於什麼的線程調用它的消息。動態創建它,將其附加到記錄器。

有多種問題,這種方法雖然:

  1. 太多追加程序會記錄
  2. AppServers通常有一個線程池放緩。這意味着隨着時間的推移,相同的線程將參與執行完全不相關的請求,這些請求將以相同的日誌文件結束。

我建議你考慮一個更簡單的方法:將線程ID記錄到同一個日誌文件中。它快速簡單,log4j有一個%標誌來做這件事。稍後,您可以根據需要對每個線程ID進行grep/split日誌文件。

更新

其實,你可能有一個自定義的附加器,這將打開按需日誌文件時,一個新的線程日誌記錄(該附加目的地線程上下文中執行,只需要調用線程。 currentThread()。的getName())。但是你必須重新實現所有常用的日誌文件任務(循環),或者將它委託給每個文件的標準appender。

+0

請參閱http://stackoverflow.com/questions/8226615/how-to-use-log4j-in-multithread-using-java – Benj 2013-03-22 15:38:47

4

我有一個標識在日誌文件中的每個線程多線程應用程序(不知道關於複式文件,單個文件顯示我的併發性),識別該線程日誌框架自動完成的,它是Log4J

編輯:沒有什麼需要在代碼中添加的,你只是在記錄儀的配置附加器,包括[%線程],將確定要從中記錄的當前消息的線程,這是例子來自log4net的:

<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender" > 
<layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
</layout> 

下面是其他常見Java logging frameworks

+0

當然我們都知道log4j,但如果你說這是可能的,你可以告訴我們簡單的實現來使用log4j來做到這一點。 – mabuzer 2010-06-24 10:52:44

0

在某些情況下,知道線程標識符遠不如知道執行上下文重要。對於大量的線程和更大的應用程序來說,情況尤其如此。當線程標識改變時,你會做什麼,但實際的執行上下文實際上是相同的(就像線程池中提到的那樣)?我寧願使用MDC (mapped diagnostic context)來跟蹤日誌中的執行上下文。這更好,因爲你控制了上下文的內容。最後,您可以設置日誌的佈局以包含MDC,然後輕鬆篩選出相關的內容。查看this tool,它用MDC做了很多事情。