使用System.Diagnostics.EventLog类读取.evtx文件失败,是否可行及问题所在?
能否用System.Diagnostics.EventLog读取本地.evtx文件?
我尝试使用System.Diagnostics命名空间下的EventLog类读取本地存储的.evtx文件,但未能成功。请问是否可以通过EventLog类读取这类存储的evtx文件?若可行,问题出在哪里?以下是我的代码:
string source = @"S:\test.evtx"; EventLog eventLog = new EventLog(); eventLog.Source = source; foreach (EventLogEntry log in eventLog.Entries) { Console.WriteLine("{0}\n", log.Message); }
解答:
首先明确说:你不能直接用EventLog类读取本地磁盘上的.evtx文件。
System.Diagnostics.EventLog的设计目标是操作Windows系统中已注册的系统/应用事件日志(比如"应用程序"、"系统"这类内置日志,或者自定义注册的日志源),它从一开始就不支持直接读取磁盘上独立存储的.evtx文件。
你代码里的核心问题在于:eventLog.Source属性需要的是事件日志的源名称(比如某个发布事件的应用程序名称),而不是本地文件路径。你把.evtx文件路径赋值给Source,系统会尝试查找名为S:\test.evtx的日志源——显然这个源不存在,所以自然读不到任何日志条目。
正确的读取方式
要读取本地的.evtx文件,你需要使用System.Diagnostics.Eventing.Reader命名空间下的专用类,比如EventLogQuery和EventLogReader,这是微软推荐的用于读取离线.evtx文件的API。
示例代码如下:
using System; using System.Diagnostics.Eventing.Reader; class EvtxReader { static void Main() { string evtxFilePath = @"S:\test.evtx"; // 创建针对本地evtx文件的查询 EventLogQuery logQuery = new EventLogQuery(evtxFilePath, PathType.FilePath); // 初始化日志读取器并遍历条目 using (EventLogReader logReader = new EventLogReader(logQuery)) { EventRecord logEntry; while ((logEntry = logReader.ReadEvent()) != null) { // 输出日志的描述内容 Console.WriteLine(logEntry.FormatDescription()); Console.WriteLine("---"); } } } }
这套API不仅能读取本地.evtx文件,还支持通过XPath查询过滤特定的日志条目,功能比EventLog类更强大灵活。
内容的提问来源于stack exchange,提问作者flaeckli
相关产品推荐
相关产品推荐

