System.Diagnostics.Tracing.EventSource 与 System.Diagnostics.Trace

use*_*248 5 c# etw

我不确定我是否理解使用 System.Diagnostics.Tracing 和使用 System.Diagnostics.Trace 的 ETW 之间的主要区别。据我了解,通过它们,我可以将事件转储到某些输出流上,并且我可以使用各种侦听器来拦截此数据 - 包括自定义侦听器。

但除了 ETW 的基础设施嵌入到 Windows 中并且我可以开箱即用地使用 WPR 和 PerfView 之外,我没有看到任何区别。

我什么时候会选择其中之一而不是另一个?

Kev*_*sse 3

System.Diagnostics.Tracing比以下更完整Trace

  • 事件按事件源隔离,这意味着您不必订阅所有事件(有利于性能)
  • 在源内部,事件按名称和“EventLevel”分隔,这意味着您可以过滤更多事件
  • 事件是结构化的(它们不仅仅是一个字符串,它们还可以具有有效负载来提供更多信息)

另一方面,System.Diagnostic.Trace它是一个简单的记录器:您只能记录字符串,并且不能应用任何类型的过滤(它要么对所有消息启用,要么对所有消息禁用)。但它的优点是 Visual Studio 调试器默认支持(因此当您附加到进程时,您可以直接在输出窗口中看到跟踪事件)。

我想补充一点,提供开箱即用的 ETW 侦听器是 的一个很好的好处System.Diagnostics.Tracing,但从技术上讲,没有什么可以阻止您为 编写自己的 ETW 侦听器Trace

  • 当您将 ETW 与静态“Trace”类进行比较时,这是完全正确的。有某事。介于两者之间:“System.Diagnostics.TraceSource”。这些与 ETW 提供商有些相似;它们还允许您记录对象,而不仅仅是字符串。然后是允许您过滤事件的跟踪级别和开关。与“Trace”与 ETW 相比,“TraceSource”与 ETW 可能是更公平的比较(因为它们在功能完整性方面更相似)...但这不是对您的答案的批评,只是一个建议。 (4认同)