我想用一个基于文件大小限制或当前日期切换文件的侦听器替换默认的 Microsoft XmlTraceListener。我想保留默认的 XmlTraceListener 文件格式,以便可以使用 ServiceTraceViewer 工具打开文件。
我发现了一篇文章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 线程安全且高效?