24

.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>

什么是默认侦听器,为什么默认存在?

一个微软的人用不同的听众对开销进行了基准测试

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

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

是否TraceListener只使用.NET 的 .NET OutputDebugString

什么是默认跟踪侦听器,为什么这么慢,为什么习惯性地删除它,如果它那么糟糕,为什么它是默认的?

4

2 回答 2

11

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

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

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

于 2011-11-04T14:00:25.060 回答
0

Trace Listeners 的工作方式似乎有点自动化,因为文档不是很清楚。假设我们有一个用于开发 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>

看看 name="Default" 可以是任何名称“myListener”也一样好。因为删除了“默认”侦听器,所以将使用该侦听器。微软应该记录这一点,因为这还不清楚。在 Microsoft 文档中,它声明您应该使用变量“myListener”,但这不是必需的,也不是正确的,因为您想要声明性的跟踪应该去哪里。

于 2019-09-26T08:03:33.700 回答