2

我正在开发一个 LOB(侧面加载)应用程序,我需要记录事件、崩溃到 ETW(事件查看器日志)。我看到大多数人建议编写自己的文件 IO 包装器。

在 Windows 8.1 中,我们在“Windows.Foundation.Diagnostics”中有新的日志记录功能,其中包含“LoggingChannel”和“LoggingSession”类。但是他们的代码示例仍然作为文件写入隔离的本地存储:

http://code.msdn.microsoft.com/windowsapps/LoggingSession-Sample-ccd52336

此外,早于 8.1,我们有“EventSource”和“EventListener”,并且根据示例项目(http://code.msdn.microsoft.com/windowsapps/Logging-Sample-for-Windows-0b9dffd7/sourcecode?fileId= 67472&pathId=1214683397),它还作为文件写入示例隔离存储。

所以,我的问题是:

  1. 我们可以利用新的“Windows.Foundation.Diagnostics”类写入 ETW 吗?

  2. ("LoggingChannel" 和 "LoggingSession") 最终是否等同于 ("EventSource" 和 "EventListener")?

  3. 我还需要编写 C++ 组件来写入 ETW 吗?

微软论坛刚刚给出了这个答案:它没有考虑到这样的事情。

我还尝试使用 PInvoke 来使用 EventRegister、EventWrite C++ 函数。代码运行,但我不知道在哪里找到日志。EventRegister 仅将 GUID 作为输入,我不知道它是否可以映射到 EventViewer 应用程序。

4

1 回答 1

1

对问题的简短回答:

  1. Windows.Foundation.Diagnostics.LoggingChannel 将事件写入 ETW。但是,它并不能像 EventRegister/EventWrite 那样让您完全控制事件。
  2. LoggingChannel 有点等价于 .NET 的 EventSource。但是,LoggingChannel 总是将事件写入 ETW,而 EventSource 可以写入 ETW,但也具有绕过 ETW 的能力。LoggingSession 在概念上与 EventListener 类似,只是 LoggingSession 总是从 ETW 接收事件,而 EventListener 只与 EventSource 一起工作(绕过 ETW)。请注意,您可以在 Windows 应用商店应用程序中同时使用 LoggingChannel 和 EventSource。
  3. 如果您需要比 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 场景,尽管它仍然适用于简单的日志记录。

于 2016-04-13T23:45:09.987 回答