2009-10-23 98 views
5

我的應用程序使用多個定義明確的名稱的線程(即不是具有'匿名'線程的線程池)。現在,所有這些線程都將其日誌消息發送到一個文件 - 儘管線程ID是日誌行的一部分,但這使得分析應用程序行爲非常困難。因此,我希望每個線程都能登錄到自己的日誌文件中。如何使用Log4Net爲每個線程登錄到單獨的文件?

Log4Net似乎沒有提供基於線程選擇appender的內置選項。有誰知道這個解決方案?請注意,我顯然寧願不切換到另一個日誌記錄庫。

+0

你最終用這個做了什麼?我有完全相同的要求,除了線程的數量和線程的名稱是不知道或設置的,直到運行時。 – 2012-03-08 17:49:37

+0

我沒有解決問題,因爲我找到了一份新工作。無論如何,彼得的解決方案會爲我工作,我想通過API爲你創建appender配置。 – 2012-03-10 07:41:42

+0

如果有人需要一個簡單的解決方案,請參閱這裏的答案http://stackoverflow.com/questions/6956064/logging-to-an-individual-log-file-for-each-individual-thread – 2014-06-03 13:34:59

回答

3

「選擇」appenders的log4net方式是通過過濾。在你的場景中,你需要設置一些appender的方法,每個appender代表一個定義明確的線程,並且在每個appender中都有過濾器,只通過它們各自的線程傳遞消息。

由於線程ID不確定,您將需要其他的東西來做你的過濾。我假設你自己正在控制這些線程的創建,並建議每個線程在the ThreadContext的屬性中註冊一個標識符。接下來,您可以使用the PropertyFilter根據標識符篩選郵件。

下面是一個示例配置設置,它有兩個appender,每個appender附加屬性threadId的當前值與給定標識符匹配的消息。

<appender name="x"> 
    <filter type="log4net.Filter.Property"> 
     <key value="threadId" /> 
     <stringToMatch value="threadX" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    ... 
</appender> 

<appender name="y"> 
    <filter type="log4net.Filter.Property"> 
     <key value="threadId" /> 
     <stringToMatch value="threadY" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    ... 
</appender> 

<root> 
    <appender-ref name="x" /> 
    <appender-ref name="y" /> 
</root> 
+0

你會怎麼做這個如果線程的數量和他們的名字直到運行時才知道? – 2012-03-08 17:48:17

+2

@goku_da_master你可以在代碼中建立appender配置,這可能是一種方法,至少如果你在控制線程創建。如果不是,我會說最好的選擇是登錄到一個可以更容易根據線程ID查詢的公共源(例如數據庫)。 – 2012-03-09 08:10:34

相關問題