我一直在使用.NET4.5新功能ETW(EventSource)。我无法使用perfmon-> Data Collector Sets将其显示在跟踪提供程序列表中。我能够使用perfview查看日志。 我能够使用其静态方法GenerateManifest从EventSource类生成清单。这将在EventSource类中提供myevents的清单,但它不包含有关通道的详细信息。
我的问题是如何在为perfmon跟踪会话生成清单文件后添加通道特定信息?我还想使用Perfmon的Tracing会话来启用提供程序而不是perfview。
非常感谢任何输入。
答案 0 :(得分:9)
MS发布了一个Nuget包,它在build:
之后注册了EventSource类注册您的EventSource
安装EventSource NuGet包时,构建步骤 前面提到过为每个文件生成以下文件 应用程序中的EventSource:
<AssemblyName>.<EventSourceTypeName>.etwManifest.man <AssemblyName>.<EventSourceTypeName>.etwManifest.dll.
需要在操作系统中注册这些文件才能启用 渠道支持。为此,请在运行后运行以下命令 文件位于其最终部署位置:
wevtutil.exe im <EtwManifestManFile> /rf:"<EtwManifestDllFile>" /mf:"<EtwManifestDllFile>"
执行此注册命令后,所有后续调用 MinimalEventSource.Log.Load()来自该机器上的任何进程 自动导致Windows事件日志中的事件。
注册后,您应该在阅读已安装提供商的所有工具中看到它。
答案 1 :(得分:0)
即使您确实修改了清单,EventSource实现也会阻止您指定通道。将事件写入ETW时,您将传递描述符块,其中指定了通道ID。不幸的是,EventSource没有提供通过属性或其他方式设置此方法的方法,并始终将此设置为零,这意味着不使用任何通道。
EventSource的行为与普通的ETW提供程序略有不同,因为它不通过win32资源公开其清单,而是发送一个“已知”ETW事件,清单作为其有效负载。这就是为什么perfmon是唯一能够识别从.NET 4.5 EventSource发送的*事件的ETW工具。
*你总是可以使用perfmon或类似的其他工具接收事件,但是他们无法解码有效载荷,例如传递给WriteEvent的参数。
编辑:See answer to a similar question
干杯 拉斯