5

我一直在努力使用 .NET4.5 的新功能 ETW(EventSource)。我无法使用 perfmon->Data Collector Sets 将其显示在跟踪提供程序列表中。我能够使用 perfview 查看日志。我能够使用 EventSource 类的静态方法 GenerateManifest 从其生成清单。这将在 EventSource 类中提供 myevents 的清单,但它不包含有关通道的详细信息。

我的问题是如何在为 perfmon 跟踪会话生成清单文件后添加通道特定信息?我还想使用 Perfmon 的跟踪会话来启用提供程序而不是 perfview。

非常感谢任何输入。

4

2 回答 2

9

MS 发布了一个 Nuget 包,它在构建后注册 EventSource 类:

http://blogs.msdn.com/b/dotnet/archive/2013/08/09/announcing-the-eventsource-nuget-package-write-to-the-windows-event-log.aspx

注册您的事件源

安装 EventSource NuGet 包时,前面提到的构建步骤会为应用程序中的每个 EventSource 生成以下文件:

<AssemblyName>.<EventSourceTypeName>.etwManifest.man
<AssemblyName>.<EventSourceTypeName>.etwManifest.dll.

这些文件需要在操作系统中注册才能启用通道支持。为此,您在文件位于其最终部署位置后运行以下命令:

wevtutil.exe im <EtwManifestManFile> /rf:"<EtwManifestDllFile>" /mf:"<EtwManifestDllFile>"

执行此注册命令后,从该计算机上的任何进程对 MinimalEventSource.Log.Load() 的所有后续调用都将自动导致 Windows 事件日志中的事件。

注册后,您应该在所有读取已安装提供程序的工具中看到它。

于 2013-08-14T17:40:59.223 回答
0

即使您确实修改了清单,EventSource 实现也会阻止您指定通道。将事件写入 ETW 时,您会传递一个描述符块,其中指定了通道 ID。不幸的是,EventSource 不提供通过属性或其他方式设置此值的方法,并且始终将其设置为零,这意味着不使用任何通道。

EventSource 的行为与普通 ETW 提供程序略有不同,因为它不通过 win32 资源公开其清单,而是发送一个“已知”ETW 事件,并将清单作为其有效负载。这就是为什么 perfmon 是唯一启用 ETW 的工具,它可以识别*从 .NET 4.5 EventSource 发送的事件。

*您始终可以使用 perfmon 或其他类似工具接收事件,但它们无法解码有效负载,例如传递给 WriteEvent 的参数。

编辑:查看类似问题的答案

干杯拉尔斯

于 2013-07-14T08:52:49.787 回答