如何在.NET中打开已保存的事件日志存档?

12

我曾使用System.Diagnostics.EventLog在本地计算机上查看日志。然而,我想打开一个保存的事件日志档案(.evt或.evtx),并查看保存文件中包含的日志。我只需要查看与文件中的日志相关的时间戳、信息、源等。是否可以用C#实现这一点?

3个回答

11

2
尝试使用 Microsoft 的 LogParser 工具。它可以使用类似 SQL 的选择语言从任何日志格式的日志中获取任何数据。它还可以从任何 .NET 应用程序中使用。以下是解析 CSV 日志的示例代码(我相信您可以通过进行少量修改来将其用于 EVT 文件):
        public IList<LogRow> GetLog()
        {
            return Load("SELECT *, OUT_ROW_NUMBER() FROM logfile*.log WHERE Field2='Performance' ORDER BY Field1 ASC");
        }

    private static IList<LogRow> Load(string sql)
    {
        IEnumerable<string[]> log = ParseLog(sql);

        return Convert(log);
    }

    private static IList<LogRow> Convert(IEnumerable<string[]> log)
    {
        return log.Select(logRecord => new LogRow
                                           {
                                               TimeStamp = logRecord[2],
                                               Category = logRecord[3],
                                               Machine = logRecord[4],
                                               ThreadId = logRecord[5],
                                               ProcessId = logRecord[6],
                                               ProcessName = logRecord[7],
                                               DomainName = logRecord[8],
                                               Message = logRecord[9],
                                               Number = logRecord[10]
                                           }).ToList();
    }


        private static IEnumerable<string[]> ParseLog(string query)
        {
            var records = new LogQueryClassClass().Execute(
                query,
                new COMCSVInputContextClass { headerRow = false, iTsFormat = "yyyy-MM-dd HH:mm:ss.fff" });
            var entries = new List<string[]>();

            while (!records.atEnd())
            {
                entries.Add(records.getRecord().toNativeString("CSVseparator").Split(
                                new[] { "CSVseparator" },
                                StringSplitOptions.None));
                records.moveNext();
            }

            records.close();
            return entries;
        }

0
如果您的意图是读取保存的日志,我们可以使用EventLogReader来实现。它基本上需要两个参数——文件名(即文件路径)和第二个参数指定路径类型。举个例子,假设您有一个保存的.evtx文件——temp.evtx,您可以这样读取它:
new EventLogReader(filepath, PathType.Filepath);

这提供了一个事件日志读取器,可以用来读取事件。而且,如果您想要从中读取内容,我们可以使用属性,它基本上是一个字符串列表。可以读取它,解析它,并获取所需的任何信息。

我同意我们没有直接获取所有细节的方法,就像使用EventLogEntry时那样。尽管如此,我们只需要对事件记录进行一些解析,就可以得到我们需要的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接