我想读取存档的 Windows 事件日志文件 (.evtx
),如本例所示:
using System;
using System.Diagnostics.Eventing.Reader;
public static class Program {
static void Main(string[] args) {
using (var reader = new EventLogReader(@"C:\tmp\some-log.evtx", PathType.FilePath)) {
EventRecord record;
while ((record = reader.ReadEvent()) != null) {
// do something with record...
}
}
}
}
record
对象有一个 Properties
列表,其中包含事件的替换字符串:
foreach (var property in record.Properties) {
Console.WriteLine(property.Value);
}
如果我在事件日志查看器中打开 .evtx
文件,我可以看到该事件的完整描述,它就像基本模板消息(应该来自与生成事件的应用程序),并将占位符的值替换为这些值:
有什么方法可以为特定事件获取此“消息模板”?
最佳答案
我后来发现这些“消息模板”可以读取与某个提供程序关联的事件元数据(基本上是注册的事件源)。
这是一个例子:
using System;
using System.Diagnostics.Eventing.Reader;
using System.Globalization;
public static class Program {
static void Main(string[] args) {
foreach (var providerName in EventLogSession.GlobalSession.GetProviderNames()) {
DumpMetadata(providerName);
}
}
private static void DumpMetadata(string providerName) {
try {
ProviderMetadata providerMetadata = new ProviderMetadata(providerName, EventLogSession.GlobalSession, CultureInfo.InvariantCulture);
foreach (var eventMetadata in providerMetadata.Events) {
if (!string.IsNullOrEmpty(eventMetadata.Description)) {
Console.WriteLine("{0} ({1}): {2}", eventMetadata.Id, eventMetadata.Version, eventMetadata.Description);
}
}
} catch (EventLogException) {
Console.WriteLine("Cannot read metadata for provider {0}", providerName);
}
}
}
关于c# - 如何获取 Windows 事件日志消息的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32841076/