我曾使用System.Diagnostics.EventLog在本地计算机上查看日志。然而,我想打开一个保存的事件日志档案(.evt或.evtx),并查看保存文件中包含的日志。我只需要查看与文件中的日志相关的时间戳、信息、源等。是否可以用C#实现这一点?
请查看 System.Diagnostics.Eventing.Reader
命名空间,特别是 EventLogQuery
类。
http://msdn.microsoft.com/zh-cn/library/bb671200(v=VS.90).aspx
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;
}
new EventLogReader(filepath, PathType.Filepath);
这提供了一个事件日志读取器,可以用来读取事件。而且,如果您想要从中读取内容,我们可以使用属性,它基本上是一个字符串列表。可以读取它,解析它,并获取所需的任何信息。
我同意我们没有直接获取所有细节的方法,就像使用EventLogEntry时那样。尽管如此,我们只需要对事件记录进行一些解析,就可以得到我们需要的内容。