.NET跟踪:什么是“默认”监听器?

时间:2011-11-04 13:55:57

标签: .net trace etw

.NET中的每个跟踪示例都会删除“Default”侦听器:

<configuration>
  <system.diagnostics>
    <sources>
      <source name="TraceSourceApp" switchName="SourceSwitch" switchType="System.Diagnostics.SourceSwitch">
        <listeners>
          <add name="ConsoleListener"/>
          <add name="ETWListener"/>
          <remove name="Default"/>
        </listeners>

什么是默认侦听器,为什么默认情况下会出现?

一个微软的家伙做了benchmarks of the overhead with different listeners

Default                    |===============================14,196 ms=====/ /================> 
TextWriterTraceListener    |=========211 ms======>
EventProviderTraceListener |=> 77ms

什么是Default跟踪侦听器,为什么它如此慢?是OutputDebugString吗? OutputDebugString真的比写入文件慢两个数量级吗?

是否只使用TraceListener的.NET OutputDebugString

什么是默认跟踪侦听器,为什么它如此缓慢,为什么通常会被删除,如果它如此糟糕,为什么它是默认值?

2 个答案:

答案 0 :(得分:10)

从博客文章中不清楚代码是如何运行的,但DefaultTraceListener的记录如下:

  

默认情况下,Write和WriteLine方法将消息发送到Win32 OutputDebugString函数和Debugger.Log方法。有关OutputDebugString函数的信息,请参阅Platform SDK或MSDN。

因此,如果Debugger.Log实际打印到UI窗口(并且很可能会滚动它等),我可以看到导致大量减速。

答案 1 :(得分:0)

跟踪侦听器的工作方式似乎有点“自动”,因为文档对此不太清楚。可以说我们有一个开发Windows服务的业务案例。在该服务中,我们使用Trace.Writeline语句将信息发送到控制台或文件。默认跟踪侦听器将信息发送到控制台。如果您运行Windows服务并通过调试器连接到正在运行的进程,则可以在控制台上看到这些消息。如果您要更改它并将跟踪信息发送到文件,则可以在app.config文件中更改它,如下所示:

<system.diagnostics>
    <trace autoflush="false" indentsize="4">
        <listeners>
           <remove name="Default" />
           <add name="Default" type="System.Diagnostics.TextWriterTraceListener" initializeData="ImportServiceOutput.log" />      
        </listeners>
     </trace>
</system.diagnostics>

查看名称=“ Default”(也可以是任何名称“ myListener”)也是如此。由于已删除“默认”侦听器,因此将使用一个侦听器。 Microsoft应该对此进行记录,因为尚不清楚。在Microsoft文档中,它声明您应该使用变量“ myListener”,但这并不是必需的,而且也不正确,因为您需要声明跟踪的位置。