我想用默认的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线程安全和高效?
您是否在多线程的默认配置中尝试过它,并确定锁定行为会导致问题?如果你想添加同步,你必须做更多的事情,而不仅仅是锁定那个变量声明。您必须锁定每次访问流。 – 2013-03-15 17:12:59