使用 C# 将事件写入 Windows 事件时,“关键字”值始终为“经典”。我一直在网上搜索,找不到任何东西。
这可能吗?如果是这样,我会很感激一个例子。
干杯
因此,当我让您正确时,您的意思是StandardEventKeywords枚举。你想写在windows日志中。正确的?
在这种情况下,您需要使用EventProvider.WriteEvent方法。在EventProvider.WriteEvent的描述中,您可以找到示例。
如果您想添加除“经典”之外的其他“关键字” - 我想您需要在 eventPayload 数组中添加适当的枚举值。试试看,让我知道结果。
要编写使用自定义关键字标记的事件日志条目,您必须创建一个事件清单文件以及一个资源 dll。然后您必须注册此清单,清单必须引用资源文件。有两种方法可以实现这一点:
手动路线更复杂,但会给您带来更清晰的结果。借助Daniel Gordon撰写的“在 .NET 中写入事件日志 - 正确方式”一文,您将能够正确记录您的事件。
总结一下过程:首先,使用 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" ) );
指定与您的清单相对应的事件描述符。看一下编译清单时生成的 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" );
这将创建一个事件日志条目,其关键字设置为清单中定义的任何内容,即带有 mask 的关键字0x1
。
如果您想从所有这些手动编译之类的东西中解脱出来,您可以使用 nuget 安装 Microsoft EventSource 库。不幸的是,这条路线有两个缺点,一是您无法定义自定义渠道,二是自定义关键字“脏”,请参阅我的冗长问题here。