.net 4.0 EventSource.net 4.0 GenerateManifest

.net 4.0 EventSource.net 4.0 GenerateManifest,.net-4.0,event-log,system.diagnostics,etw,etw-eventsource,.net 4.0,Event Log,System.diagnostics,Etw,Etw Eventsource,我一直在尝试在.NET4.0中使用ETW 我已经开始使用Microsoft EventSource Library 1.0.4-beta() 下面是我为应用程序生成事件而编写的代码 [EventSource(Name = "Samples-EventSourceDemos-EventSourceLogger")] public sealed class EventSourceLogger : EventSource { public static EventSourceLogger Lo

我一直在尝试在.NET4.0中使用ETW

我已经开始使用Microsoft EventSource Library 1.0.4-beta()

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

[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。我真的不确定这些将如何帮助清单生成

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


提前感谢。

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

注册您的EventSource

安装EventSource NuGet包时,生成步骤 前面提到的为每个 应用程序中的EventSource:

AssemblyName.EventSourceTypeName.etwManifest.man

AssemblyName.EventSourceTypeName.etwManifest.dll

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

wevtutil.exe im etwmanistmanifest文件/rf:“etwmanistdllfile”c/mf:“etwmanistdllfile”

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


我找到了解决这个问题的办法。现在我可以注册事件并将其发布到eventviewer


谢谢。

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

但是,根据您正在执行的操作,您可能仍然需要手动生成清单。这里有一种方法:

  • 将(
    安装包Microsoft.Diagnostics.Tracing.EventSource
    )安装到项目中,或者在需要的地方下载并解包
  • 找到
    eventRegister.exe
    。(它很可能位于文件夹下的某个位置,类似于相对于软件包安装文件夹的
    packages\Microsoft.Diagnostics.Tracing.EventRegister.1.1.26\build
  • 运行以下命令:
  • eventRegister.exe{eventsource类的dll路径}{清单输出文件前缀}

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

    • {prefix}{EventSource Name}.etwmansifest.dll
    • {prefix}{EventSource Name}.etwmansifest.man
    这些是您可以提供给的:


    我没有看到生成AssemblyName.EventSourceTypeName.EwManifest.man和AssemblyName.EventSourceTypeName.EwManifest.dll。您能告诉我如何生成清单吗?eventRegister.exe是否正确执行。在MS博客中也会问这个问题,这个版本只是测试版,所以可能仍然存在问题。如果您希望使用管理通道(需要注册清单和dll)写入EventViewer,那么您仍然需要生成清单。如果你知道更好的方法,请让我知道。我仍然不知道为什么它对你来说失败。创建一个新的C#控制台应用程序并添加以下内容:安装软件包Microsoft.Diagnostics.Tracing.EventSource.Samples-在我看到调试文件夹中的文件DemoEventSource.Samples-EventSourceDemos-EventLog.etwManifest.man之前。上介绍了一些有用的工具
    wevtutil.exe 
       im {EtwManifestManFile} 
       /rf:"{EtwManifestDllFile}" 
       /mf:"{EtwManifestDllFile}"