.net 基于XmlWriterTraceListener的线程安全跟踪侦听器

.net 基于XmlWriterTraceListener的线程安全跟踪侦听器,.net,thread-safety,extend,tracelistener,.net,Thread Safety,Extend,Tracelistener,我想用一个侦听器替换默认的Microsoft的XmlTraceListener,该侦听器根据文件大小限制或当前日期切换文件。我希望保留默认的XmlTraceListener文件格式,以便可以使用ServiceTraceViewer工具打开文件 我发现了一篇文章,但从评论来看,即使在应用了建议的补丁之后,这个监听器仍然有一些不稳定性 然后我找到了微软自己的CircularListener实现 我想扩展它,但注意到它已经 static CircularStream m_stream = null;

我想用一个侦听器替换默认的Microsoft的XmlTraceListener,该侦听器根据文件大小限制或当前日期切换文件。我希望保留默认的XmlTraceListener文件格式,以便可以使用ServiceTraceViewer工具打开文件

我发现了一篇文章,但从评论来看,即使在应用了建议的补丁之后,这个监听器仍然有一些不稳定性

然后我找到了微软自己的CircularListener实现

我想扩展它,但注意到它已经

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等方面的运气要好得多。

您是否在多线程的默认配置中尝试过它,并确定锁定行为会导致问题?如果您想添加同步,您必须做的不仅仅是锁定变量声明。您必须锁定对流的每个访问。您是否在多线程的默认配置中尝试了它,并确定锁定行为导致了问题?如果您想添加同步,您必须做的不仅仅是锁定变量声明。您必须锁定对流的每个访问。