System.Diagnostics.Tracing.EventSource 对比 System.Diagnostics.Trace
System.Diagnostics.Tracing.EventSource vs System.Diagnostics.Trace
我不确定我是否理解使用 System.Diagnostics.Tracing 和使用 System.Diagnostics.Trace 的 ETW 之间的主要区别。我知道使用它们我可以将事件转储到一些输出流中,并且我可以使用各种侦听器来拦截这些数据——包括自定义侦听器。
但除了 ETW 的基础结构嵌入 Windows 并且我可以开箱即用地使用 WPR 和 PerfView 之外,我看不出有什么不同。
我什么时候会选择一个而不是另一个?
System.Diagnostics.Tracing
比 Trace
:
更完整
- 事件按事件源分隔,这意味着您不必订阅所有事件(有利于性能)
- 在源内部,事件按名称和 "EventLevel" 分开,这意味着您可以过滤更多
- 事件是结构化的(它们不仅仅是一个字符串,它们还可以有负载来提供更多信息)
另一方面,System.Diagnostic.Trace
是一个简单的记录器:您只能记录字符串,并且不能应用任何类型的过滤(它要么对所有消息启用,要么对所有消息禁用)。但它的优点是 Visual Studio 调试器默认支持(因此当您附加到进程时,您可以直接在输出 window 中看到跟踪事件)。
我要补充一点,开箱即用的 ETW 侦听器是 System.Diagnostics.Tracing
的一个不错的福利,但从技术上讲,没有什么可以阻止您为 Trace
编写自己的 ETW 侦听器。
我不确定我是否理解使用 System.Diagnostics.Tracing 和使用 System.Diagnostics.Trace 的 ETW 之间的主要区别。我知道使用它们我可以将事件转储到一些输出流中,并且我可以使用各种侦听器来拦截这些数据——包括自定义侦听器。
但除了 ETW 的基础结构嵌入 Windows 并且我可以开箱即用地使用 WPR 和 PerfView 之外,我看不出有什么不同。
我什么时候会选择一个而不是另一个?
System.Diagnostics.Tracing
比 Trace
:
- 事件按事件源分隔,这意味着您不必订阅所有事件(有利于性能)
- 在源内部,事件按名称和 "EventLevel" 分开,这意味着您可以过滤更多
- 事件是结构化的(它们不仅仅是一个字符串,它们还可以有负载来提供更多信息)
另一方面,System.Diagnostic.Trace
是一个简单的记录器:您只能记录字符串,并且不能应用任何类型的过滤(它要么对所有消息启用,要么对所有消息禁用)。但它的优点是 Visual Studio 调试器默认支持(因此当您附加到进程时,您可以直接在输出 window 中看到跟踪事件)。
我要补充一点,开箱即用的 ETW 侦听器是 System.Diagnostics.Tracing
的一个不错的福利,但从技术上讲,没有什么可以阻止您为 Trace
编写自己的 ETW 侦听器。