c# - 如何获取 Windows 事件日志消息的模板

标签 c# windows event-log

我想读取存档的 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 文件,我可以看到该事件的完整描述,它就像基本模板消息(应该来自与生成事件的应用程序),并将占位符的值替换为这些值:

enter image description here

有什么方法可以为特定事件获取此“消息模板”?

最佳答案

我后来发现这些“消息模板”可以读取与某个提供程序关联的事件元数据(基本上是注册的事件源)。

这是一个例子:

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/

相关文章:

c# - 使用 .net 检查事件日志中是否记录了事件的最简单方法是什么?

xpath - NT事件日志XPath查询

C# 字典 - 自定义对象

windows - Windows程序使用多少个堆栈?

visual-studio-2008 - 在 Visual Studio 2008 中将控制台应用程序转换为 Windows 应用程序?

linux - 将linux的Windows子系统安装在docker中时, '~'扩展到哪里?

windows - 应用程序事件日志超过最大允许计数

c# - 我如何在内存列表中分组?

c# - 在调试器可视化器中获取变量名

c# - 为什么 MassTransit 不将消息推送到 MSMQ,除非有订阅者?这是如何解决的?