我一直在尝试在.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。我不确定这些如何有助于显示生成。
如果任何人对此有任何想法(或),请帮助。
提前致谢。
@ magicandre1981的答案是正确的,因为没有必要使用较新版本的.NET
和EventSource
生成清单。 (事实上,它仍然存在,但它只是隐藏在构建事件后面,当你安装EventSource package时,它会被放入你的项目文件中。)
但是,根据您正在执行的操作,您可能仍需要手动生成清单。这是一种方法:
Install-Package Microsoft.Diagnostics.Tracing.EventSource
)安装到您的项目中或下载并在需要的地方打开它eventRegister.exe
。 (它很可能是相对于包安装文件夹类似于packages\Microsoft.Diagnostics.Tracing.EventRegister.1.1.26\build
的文件夹下的某个地方)eventRegister.exe {path-to-dll-with-your-eventsource-class} {manifest-output-file-prefix}
之后,您将在dll中看到每个EventSource类的两个文件:
然后那些你可以喂wevtutil的那些:
wevtutil.exe
im {EtwManifestManFile}
/rf:"{EtwManifestDllFile}"
/mf:"{EtwManifestDllFile}"
你不需要再获得Manifest了。您现在可以直接注册EventSource:
注册您的EventSource
安装EventSource NuGet包时,前面提到的构建步骤会为应用程序中的每个EventSource生成以下文件:
Assembly name.event source type name.ET为manifest.满
AssemblyName.EventSourceTypeName.etwManifest.dll。
需要在操作系统中注册这些文件以启用通道支持。要执行此操作,请在文件位于其最终部署位置后运行以下命令:
wevtutil.exe im EtwManifestManFile / rf:“EtwManifestDllFile”c / mf:“EtwManifestDllFile”
微软在这个博客中解释了这个:
Announcing the EventSource NuGet Package – Write to the Windows Event Log
我能找到解决方案。现在我可以注册并将事件发布到事件查看器。
谢谢。