使用C#将事件写入Windows事件时,“关键字”值始终为“经典”。我一直在网上挖掘,找不到任何东西 这可能吗?如果是这样,我会感激一个例子。
干杯
答案 0 :(得分:1)
因此,当我告诉您正确时,您的意思是StandardEventKeywords枚举。而你想写在Windows日志中。正确?
在这种情况下,您需要使用EventProvider.WriteEvent方法。在EventProvider.WriteEvent的说明中,您可以找到示例。
如果你想添加其他“关键字”而不是“经典” - 我想你需要在eventPayload数组中添加适当的枚举值。尝试一下,让我知道结果。
答案 1 :(得分:1)
要编写标记有自定义关键字的事件日志条目,您必须创建事件清单文件以及资源dll。然后你必须注册这个清单,清单必须引用资源文件。有两种方法可以实现这一目标:
手动路线更复杂,但为您提供更清晰的结果。借助文章" Writing to the event log in .NET - the right way"通过Daniel Gordon,您将能够正确记录您的活动。
总结程序:首先,使用ecmangen创建清单。阅读该工具提供的帮助,它将引导您完成创建过程。使用自定义keywords
部分创建清单后,使用mc编译它,然后按照文章中的描述生成资源文件。要使用清单,必须将其安装为事件日志源。使用wevtutil程序执行此操作。如果您不改变清单以指向先前创建的资源DLL,则程序将失败。关于此过程的一个奇怪的事情是wevtutil程序继续报告错误,除非您已将资源文件复制到其路径中不包含空格的位置。
成功注册事件源后,可以使用System.Diagnostics.Eventing命名空间将事件记录到该事件源。像这样创建一个EventProvider:
var provider = new EventProvider( new Guid( "VALUE-OF-GUID-ATTRIBUTE-OF-PROVIDER-ELEMENT-IN-MANIFEST" ) );
指定与您的清单对应的Eventdescriptor。看一下编译清单时生成的cs文件。
EventDescriptor customDescriptor;
unchecked
{
customDescriptor = new EventDescriptor( 0x2, 0x0, 0x10, 0x4, 0xa, 0x1, ( long ) 0x8000000000000001 );
}
最后,将Eventdescriptor传递给您的提供者以记录消息:
var customEventResult = provider.WriteEvent( ref customDescriptor, (long)1, 1, "Custom Event" );
这将创建一个事件日志条目,其关键字设置为清单中定义的任何关键字,并带有掩码0x1
。
如果您希望自己保存所有这些手动编译和诸如此类的东西,您可以使用nuget安装Microsoft EventSource库。不幸的是,这条路线有两个缺点,一个是您无法定义自定义渠道,第二个是自定义关键字是"脏",请参阅我冗长的问题here。