2013-03-15 43 views
1

我想用默認的Microsoft XmlTraceListener替換爲基於文件大小限制或當前日期切換文件的監聽器。我想保留默認的XmlTraceListener文件格式,以便我可以使用ServiceTraceViewer工具打開文件。基於XmlWriterTraceListener的線程安全跟蹤監聽器

我發現了一篇文章http://www.codeproject.com/Articles/30956/A-Rolling-XmlWriterTraceListener,但是從評論看來,即使在應用了建議的修補程序之後,此偵聽器仍然存在一些不穩定性。

後來我發現微軟自己實現CircularListener http://msdn.microsoft.com/en-us/library/aa395205.aspx

我想擴展它的,但發現它有

static CircularStream m_stream = null; 

,無鎖被訪問後這個變量。在閱讀http://msdn.microsoft.com/en-us/library/ms733025.aspx時,我發現即使XmlWriterTraceListener本身也不是線程安全的。 MSDN說:

因爲System.Diagnostics.XmlWriterTraceListener是不是線程安全的, 跟蹤源可完全鎖定資源輸出 痕跡時。當許多線程向配置爲 的跟蹤源輸出跟蹤以使用此偵聽器時,可能會發生資源爭用,導致 是一個重大性能問題。若要解決此問題,您應該 實現線程安全的自定義偵聽器。

所以基本上這意味着TraceListener.IsThreadSafe財產留給false爲XmlWriterTraceListener,所以後來每次上級跟蹤系統鎖定時TRACEDATA/TraceEvent叫,是嗎?

從圍繞該static CircularStream m_stream和返回true形成覆蓋IsThreadSafe屬性增加一個鎖會有任何好處嗎?或者也許它會和XmlTraceListener中已經完成的事情一樣?

我能做些什麼來使CircularTraceListener線程安全和高效?

+0

您是否在多線程的默認配置中嘗試過它,並確定鎖定行爲會導致問題?如果你想添加同步,你必須做更多的事情,而不僅僅是鎖定那個變量聲明。您必須鎖定每次訪問流。 – 2013-03-15 17:12:59

回答

1

我認爲CircularTraceListener基本上是有缺陷的。你已經注意到有一個staticm_stream。但更糟糕的是,當您構建一個CircularTraceListener時,它會將新流傳遞到基礎(XmlWriterTraceListener)。這意味着雖然CircularTraceListener僅知道上一個創建的流,但該基類有可能使用多個流中的一個。當然,如果CircularTraceListener得到處理,基類將處理共享的m_stream對象。

我建議你不要基於CircularTraceListener任何東西,並從頭開始。

更新:

我已經受夠了的東西像log4net的和NLOG對於像循環記錄更好的運氣。