对问题的简短回答:
- Windows.Foundation.Diagnostics.LoggingChannel 将事件写入 ETW。但是,它并不能像 EventRegister/EventWrite 那样让您完全控制事件。
- LoggingChannel 有点等价于 .NET 的 EventSource。但是,LoggingChannel 总是将事件写入 ETW,而 EventSource 可以写入 ETW,但也具有绕过 ETW 的能力。LoggingSession 在概念上与 EventListener 类似,只是 LoggingSession 总是从 ETW 接收事件,而 EventListener 只与 EventSource 一起工作(绕过 ETW)。请注意,您可以在 Windows 应用商店应用程序中同时使用 LoggingChannel 和 EventSource。
- 如果您需要比 LoggingChannel 或 EventSource 提供的更多功能,则必须编写 C++ 代码才能使用 ETW。
基于你提到的事情的一些其他评论:
- 事件查看器显示来自事件日志的数据。事件日志与 ETW 不同。Event Viewer 记录来自各种来源的数据,ETW 是 Event Viewer 支持的来源之一。但是,事件查看器不会记录所有 ETW 事件 - 每小时有数十亿个 ETW 事件,如果所有这些事件都被记录下来,它将填满您的硬盘。要将 ETW 事件发送到事件查看器,您首先必须使您的事件遵循某些规则,然后您必须更新事件查看器设置以查看您的特定事件。
- 事件日志旨在记录系统管理员和系统分析工具感兴趣的事件。由于这种设计,Microsoft 需要管理员权限才能更改事件日志配置。为了让您的事件显示在事件日志中,您需要具有管理员权限才能更改事件日志设置,以使事件日志侦听您的应用程序的 ETW 事件。
- LoggingChannel 不支持使您的 ETW 事件看起来像 Event Log 预期的必要设置,因此 LoggingChannel 不能用于写入 Event Log。
- 如果您使用 EventRegister 和 EventWrite,您可以按照 Event Log 预期的格式编写事件,但您仍然需要具有管理员权限才能更改 Event Log 设置以接受您的事件。
请注意,EventRegister 和 EventWrite(以及 LoggingChannel)用于向 ETW 发送数据。您可以向 ETW 发送任何您想要的内容,但默认情况下,ETW 会忽略它并将其全部丢弃。ETW 是用于将事件从提供者路由到对事件感兴趣的任何人的系统。如果没有人对该事件感兴趣,则默认将其丢弃。
LoggingChannel 将事件写入 ETW,但 ETW 只会删除它们,除非有会话记录它们。在您的应用程序中,您可以使用 LoggingSession 记录事件。从应用程序外部,您可以使用 xperf 或 tracelog 等工具记录事件。
您可以使用 Windows 8.1 中的 Windows.Foundation.Diagnostics.LoggingChannel 来编写具有一些限制的 ETW 事件。特别是:来自所有应用程序的所有事件将始终使用相同的提供程序 GUID (4bd2826e-54a1-4ba9-bf63-92b73ea1ac4a),无法访问 ETW 的关键字、通道、任务或操作码功能,您只能编写非常简单的事件。Windows 8.1 LoggingChannel API 主要专注于提供简单的基于字符串的日志记录工具。
Windows 10 添加了许多新功能,消除了许多限制。您可以使用不同的提供者 GUID(因此更容易只记录来自您的应用程序的事件),您可以设置关键字、任务和操作码,并且您可以编写强类型事件(即具有强类型字段值的事件只是一个扁平的字符串)。Windows 10 LoggingChannel API 允许您将 LoggingChannel 用于相当高级的 ETW 场景,尽管它仍然适用于简单的日志记录。