我正在开发一个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),它还将样本隔离存储写为文件。
所以,我的问题是:
我们可以利用新的" Windows.Foundation.Diagnostics"写给ETW的课程?
是(&#34; LoggingChannel&#34;和#34; LoggingSession&#34;)等同于(&#34; EventSource&#34;和&#34; EventListener&#34;)最终?< / p>
我是否仍然需要编写C ++组件来写入ETW?
微软论坛刚刚给出了这个答案: 它的设计并没有考虑到这一点。
我也尝试使用PInvoke来使用EventRegister,EventWrite C ++函数。代码运行但我不知道在哪里找到日志。 EventRegister只接受GUID作为输入,我不知道它是否可以映射到EventViewer应用程序。
答案 0 :(得分:1)
对问题的简短回答:
根据您提到的事情做出的其他一些评论:
请注意,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场景,尽管它仍适用于简单的日志记录。