EventSource .net 4.0 GenerateManifest

时间:2013-09-20 09:33:03

标签: .net-4.0 event-log system.diagnostics etw etw-eventsource

我一直在尝试在.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。我不确定这些如何有助于显示生成。

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

提前致谢。

3 个答案:

答案 0 :(得分:8)

@ magicandre1981的回答是正确的,因为

} (事实上​​,它仍在进行中,但它只是隐藏在构建事件后面,当您安装EventSource package时,该事件会被放入您的项目文件中。)

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

  1. EventSource package.NET)安装到您的项目中,或下载并将其解压缩到您需要的地方
  2. 找到EventSource。 (它很可能是相对于包安装文件夹的类似于Install-Package Microsoft.Diagnostics.Tracing.EventSource的文件夹下的某个地方)
  3. 运行以下命令:
  4. eventRegister.exe

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

    • {prefix} {EventSource Name} .etwManifest.dll
    • {prefix} {EventSource Name} .etwManifest.man

    然后您可以将这些内容提供给wevtutil

    packages\Microsoft.Diagnostics.Tracing.EventRegister.1.1.26\build

答案 1 :(得分:4)

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

  

注册您的EventSource

     

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

     

AssemblyName.EventSourceTypeName.etwManifest.man

     

AssemblyName.EventSourceTypeName.etwManifest.dll。

     

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

     

wevtutil.exe im EtwManifestManFile / rf:“EtwManifestDllFile”c / mf:“EtwManifestDllFile”

Microsoft在此博客中解释了这一点:

Announcing the EventSource NuGet Package – Write to the Windows Event Log

答案 2 :(得分:0)

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

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

感谢。