.net 基于XmlWriterTraceListener的线程安全跟踪侦听器
我想用一个侦听器替换默认的Microsoft的XmlTraceListener,该侦听器根据文件大小限制或当前日期切换文件。我希望保留默认的XmlTraceListener文件格式,以便可以使用ServiceTraceViewer工具打开文件 我发现了一篇文章,但从评论来看,即使在应用了建议的补丁之后,这个监听器仍然有一些不稳定性 然后我找到了微软自己的CircularListener实现 我想扩展它,但注意到它已经.net 基于XmlWriterTraceListener的线程安全跟踪侦听器,.net,thread-safety,extend,tracelistener,.net,Thread Safety,Extend,Tracelistener,我想用一个侦听器替换默认的Microsoft的XmlTraceListener,该侦听器根据文件大小限制或当前日期切换文件。我希望保留默认的XmlTraceListener文件格式,以便可以使用ServiceTraceViewer工具打开文件 我发现了一篇文章,但从评论来看,即使在应用了建议的补丁之后,这个监听器仍然有一些不稳定性 然后我找到了微软自己的CircularListener实现 我想扩展它,但注意到它已经 static CircularStream m_stream = null;
static CircularStream m_stream = null;
之后,这个变量将在没有锁的情况下被访问。阅读时,我发现即使XmlWriterTraceListener本身也不是线程安全的。MSDN说:
因为System.Diagnostics.XmlWriterTraceListener不是线程安全的,
在输出时,跟踪源可以独占地锁定资源
踪迹。当多个线程向配置的跟踪源输出跟踪时
要使用此侦听器,可能会发生资源争用,从而导致
一个重要的性能问题。要解决此问题,您应该
实现线程安全的自定义侦听器
因此,本质上这意味着对于XMLWriterTraceStener,TraceListener.IsThreadSafe
属性保留为false
,因此,每当调用TraceData/TraceEvent时,更高级别的跟踪系统都会锁定,对吗
在static CircularStream m_流
周围添加锁并从重写的IsThreadSafe
属性返回true
会有什么好处?或者,它可能与XmlTraceListener中已经在做的事情相同
如何使CircularTraceListener线程安全高效?我认为
CircularTraceListener
基本上是有缺陷的。正如您所注意到的,有一个静态m_流
。但是,更糟糕的是,当您构造一个CircularTraceListener
时,它会沿着新流传递到基(XmlWriterTraceListener
)。这意味着,尽管CircularTraceListener
只知道最后创建的流,但基类可能正在使用许多流中的一个。当然,如果CircularTraceListener
被释放,基类将释放共享m_流
对象
我建议你不要从CircularTraceListener
开始,从头开始
更新:
对于像循环日志记录这样的事情,我在log4net和NLog方面的运气要好得多。我认为CircularTraceListener
基本上是有缺陷的。正如您所注意到的,有一个静态m_流
。但是,更糟糕的是,当您构造一个CircularTraceListener
时,它会沿着新流传递到基(XmlWriterTraceListener
)。这意味着,尽管CircularTraceListener
只知道最后创建的流,但基类可能正在使用许多流中的一个。当然,如果CircularTraceListener
被释放,基类将释放共享m_流
对象
我建议你不要从CircularTraceListener
开始,从头开始
更新:
对于循环日志记录,我在log4net和NLog等方面的运气要好得多。您是否在多线程的默认配置中尝试过它,并确定锁定行为会导致问题?如果您想添加同步,您必须做的不仅仅是锁定变量声明。您必须锁定对流的每个访问。您是否在多线程的默认配置中尝试了它,并确定锁定行为导致了问题?如果您想添加同步,您必须做的不仅仅是锁定变量声明。您必须锁定对流的每个访问。