3

我一直在尝试在 .net 4.0 中使用 ETW。

我已经开始使用 Microsoft EventSource Library 1.0.4-beta ( https://www.nuget.org/packages/Microsoft.Diagnostics.Tracing.EventSource )

这是我为我的应用程序生成事件而编写的代码。

[EventSource(Name = "Samples-EventSourceDemos-EventSourceLogger")]
public sealed class EventSourceLogger : EventSource
{
    public static EventSourceLogger Log = new EventSourceLogger();

    public static string GetManifest()
    {
        return GenerateManifest(typeof(EventSourceLogger), null);
    }

    [Event(200, Level = Microsoft.Diagnostics.Tracing.EventLevel.Informational, Task = EventTask.None, Version = 1,
        Opcode = EventOpcode.Info, Keywords = EventKeywords.None, Channel = EventChannel.Admin,
        Message = "Test Message")]
    public void LogEtwInfoEventMessage(string jsonArgs)
    {
        if (!this.IsEnabled()) return;

        this.WriteEvent(200, jsonArgs);
    }

    [Event(400, Level = Microsoft.Diagnostics.Tracing.EventLevel.Error, Task = EventTask.None, Version = 1,
        Opcode = EventOpcode.Info, Keywords = EventKeywords.None, Channel = EventChannel.Admin, Message = "Test Message")]
    public void LogEtwErrorEventMessage(string jsonArgs)
    {
        if (!this.IsEnabled()) return;

        this.WriteEvent(400, jsonArgs);
    }

    [Event(500, Level = Microsoft.Diagnostics.Tracing.EventLevel.Warning, Task = EventTask.None, Version = 1,
       Opcode = EventOpcode.Info, Keywords = EventKeywords.None, Channel = EventChannel.Admin, Message = "Test Message")]
    public void LogEtwWarningEventMessage(string jsonArgs)
    {
        if (!this.IsEnabled()) return;

        this.WriteEvent(500, jsonArgs);
    }
}

我无法从侦听器生成清单。下面的代码

var manifestXml = EventSourceLogger.GetManifest();

当我尝试调用它时,我得到 NullReferenceException,请建议我遗漏任何东西。是否可以使用此版本将 EventMessage 推送到 EventViewer。

作为这个 NuGet 包的一部分,我有 eventRegister、Install Bat、Microsoft.Diagnostics.Tracing.EventSource.targets。我不确定这些将如何帮助清单生成。

如果有人对此有任何想法(或)工作,请提供帮助。

提前致谢。

4

3 回答 3

8

@magicandre1981 的答案是正确的,因为没有必要.NET使用和的较新版本生成清单EventSource。(事实上​​,它仍在发生,但它只是隐藏在一个构建事件后面,当您安装EventSource 包时,该构建事件会被放入您的项目文件中。)

但是,根据您的操作,您可能仍需要手动生成清单。这是一种方法:

  1. 将EventSource 包( )安装Install-Package Microsoft.Diagnostics.Tracing.EventSource到您的项目中,或者在您需要的地方下载并解压
  2. 找到eventRegister.exe. (它很可能位于类似于packages\Microsoft.Diagnostics.Tracing.EventRegister.1.1.26\build相对于软件包安装文件夹的文件夹下)
  3. 运行以下命令:

eventRegister.exe {path-to-dll-with-your-eventsource-class} {manifest-output-file-prefix}

之后,您将看到 dll 中每个 EventSource 类的两个文件:

  • {前缀}{事件源名称}.etwManifest.dll
  • {前缀}{事件源名称}.etwManifest.man

这些是您可以提供给wevtutil的:

wevtutil.exe 
   im {EtwManifestManFile} 
   /rf:"{EtwManifestDllFile}" 
   /mf:"{EtwManifestDllFile}"
于 2015-11-21T00:07:55.987 回答
4

您不再需要获取清单。您现在可以直接注册 EventSource:

注册您的事件源

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

AssemblyName.EventSourceTypeName.etwManifest.man

AssemblyName.EventSourceTypeName.etwManifest.dll。

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

wevtutil.exe im EtwManifestManFile /rf:"EtwManifestDllFile"c /mf:"EtwManifestDllFile"

Microsoft 在此博客中对此进行了解释:

宣布 EventSource NuGet 包 - 写入 Windows 事件日志

于 2013-09-20T19:51:50.820 回答
0

我能够找到解决方案。现在我可以注册事件并将其发布到事件查看器。

http://naveensrinivasan.com/2010/03/17/using-clr-4-0-event-tracing-for-windows-etw-along-with-application-etw/

谢谢。

于 2013-09-25T11:00:22.053 回答