2011-03-01 10 views
1

我的應用程序無限期運行多個並行獨立的線程。我正在使用log4net來記錄信息。爲單獨的線程動態加載log4net.Config? C#/。NET

我希望動態儀器log4net的日誌記錄配置信息。 (即:其中一個線程正在做一些奇怪的事情,我可以在進入時爲其注入更詳細的配置)。 我正在使用log4net.Config方法在其中一個線程中即時加載XML配置文件。不幸的是,它似乎影響了其他線程。

有沒有辦法使用log4net的時候隔離配置爲每個線程?

謝謝!

回答

1

使用LogManager.GetLogger(「MyApp.Thread1」)爲將要運行的每個線程創建一個新的記錄器。這個方法可以接受一個字符串,所以給每個人一個不同的名字。那麼你應該可以單獨使用每個日誌級別。

<!-- Set root logger level to DEBUG and its only appender to A1 --> 
<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="A1" /> 
</root> 

<!-- Print only messages of level WARN or above in the package Com.Foo --> 
<logger name="MyApp.Thread1"> 
    <level value="WARN" /> 
</logger> 

的更多信息: http://logging.apache.org/log4net/release/manual/configuration.html

另外,如果你是剛剛開始,退房Log4View。我沒有任何關係,只是一個滿意的客戶。

0

我只是幾乎沒有開始使用log4net自己,所以我很抱歉如果這沒有用,但我認爲這個問題可以使用Contexts功能解決。

您可以通過的一個組合,讓您的特定線程,並使用上下文過濾器:

編輯

仔細觀察這些,似乎Mdc/Ndc是遺留特徵,所以也許這不是'最好的選擇。所以,這是另一個想法。

根據你如何識別你的線程(如果你不是在一個線程池中種植完全黑盒的任務),你可以簡單地命名你的記錄器,並使用過濾器來匹配記錄器名稱。

http://logging.apache.org/log4net/release/sdk/log4net.Filter.LoggerMatchFilter.html

可以,只要在運行時配置的過濾器,你的方式加載你的配置,它會自動重載:Configuration Attributes(尤其是Watch = true)。

您也可以將您的PERF起來時不使用塊像if(log.IsDebugEnabled) { /* do logging here */ }記錄。

0

你是什麼意思,「不幸的是,它似乎影響其他線程」?

我在考慮性能或鎖定。

如果你的線程被鎖定(即。第一個線程日誌,但在日誌呼叫中的其他掛起),那麼你需要FileAppenderMinimalLocking選項。這樣,一旦記錄器寫入日誌文件,就會將文件句柄釋放給其他線程。不幸的是,這會影響性能(但表現仍取決於內核:如果Mac或Linux的內核,當你去爲單聲道,在處理打開/關閉操作變得更快或更慢,你會得到不同的結果),因爲連續收盤/平/打開。

最終溶液是聲明不同追加程序不同記錄器。對於每個實例化(以前認識他們!)記錄儀,申報獨家使用專用FileAppender,所以線程不會進入併發問題。

+0

我不同意。您可以將多個線程記錄到同一個文件中,而不會出現併發問題。您無法保證日誌條目的顯示順序,但我從來沒有遇到任何問題。 OP沒有鎖定任何東西,他只想在運行時控制每個線程日誌輸出的詳細程度。 – 2011-03-01 16:26:15

+0

我也不同意。如果線程共享同一個記錄器實例,則不會發生併發問題(但可能會影響性能)。但是,如果他們每個調用一次GetLog,那麼會創建多個實例。無論如何,他沒有提到這些問題,這是真正的問題! – 2011-03-01 17:17:20