在Windows RT 8.1上记录到事件查看器

时间:2014-03-31 05:27:53

标签: windows-store-apps pinvoke event-viewer windows-rt

我正在开发一个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. 是(&#34; LoggingChannel&#34;和#34; LoggingSession&#34;)等同于(&#34; EventSource&#34;和&#34; EventListener&#34;)最终?< / p>

  3. 我是否仍然需要编写C ++组件来写入ETW?

  4. 微软论坛刚刚给出了这个答案: 它的设计并没有考虑到这一点。

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

1 个答案:

答案 0 :(得分: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。
  4. 根据您提到的事情做出的其他一些评论:

    • 事件查看器显示事件日志中的数据。事件日志与ETW不同。事件查看器记录来自各种源的数据,ETW是事件查看器支持的源之一。但是,事件查看器不记录所有ETW事件 - 每小时有数十亿个ETW事件,如果记录了所有事件,它将填满您的硬盘。要将ETW事件发送到事件查看器,首先必须使事件遵循某些规则,然后必须更新事件查看器设置以监视特定事件。
    • 事件日志旨在记录系统管理员和系统分析工具感兴趣的事件。由于此设计,Microsoft需要管理员权限才能更改事件日志配置。为了让您的活动显示在事件日志中,您需要具有管理员权限才能更改事件日志设置,以使事件日志收听您应用的ETW事件。
    • LoggingChannel不支持必要的设置,使您的ETW事件看起来像事件日志所期望的那样,因此无法使用LoggingChannel写入事件日志。
    • 如果您使用EventRegister和EventWrite,您可以按事件日志所期望的格式编写事件,但您仍需要具有管理员权限才能更改事件日志设置以接受您的事件。

    请注意,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场景,尽管它仍适用于简单的日志记录。