.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
?
什么是默认跟踪侦听器,为什么它如此缓慢,为什么通常会被删除,如果它如此糟糕,为什么它是默认值?
答案 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”,但这并不是必需的,而且也不正确,因为您需要声明跟踪的位置。