我正在研究一个项目,以读取和显示Windows事件日志。我已使用以下代码从事件日志中读取事件并显示它们。
public static void Main(string[] args)
{
EventLog[] ev;
ev = EventLog.GetEventLogs();
Console.WriteLine("Number of logs on computer: " + ev.Length);
foreach (EventLog log in ev)
{
Console.WriteLine("Log: " + log.Log);
foreach (EventLogEntry entry in log.Entries)
{
Console.WriteLine("Entry: " + entry.Message);
Console.WriteLine("Source: " + entry.Source);
Console.WriteLine("Category: " + entry.Category);
Console.WriteLine("EventID: " + entry.Source);
}
}
}
此代码可以正常工作。它显示所有已存储在日志文件中的事件。但是,在此之后我想要实现的是,我必须阅读即将发生的事件和update them every 10 seconds
。
如果我继续并再次调用同一函数,我将获得所有事件,但是我只想要新添加的事件。我该如何实现?
TL DR:我只想听事件日志中新添加的事件,而不是整个事件日志
答案 0 :(得分:2)
您可以做到
EventLog appLogs = new EventLog("Application");
var entries = appLogs.Entries.Cast<EventLogEntry>()
.Where(x => x.TimeWritten >= DateTime.Now.AddMinutes(-60))
.ToList();
但是,无论何时过滤仍会花费相同的时间。
我没有办法加快(我知道)的速度
尽管您可能想研究EventLog.EntryWritten Event
将条目写入本地计算机上的事件日志时发生。
Remnarks
要获取事件通知,必须将EnableRaisingEvents设置为true。 当条目被写入时,您只能接收事件通知 本地计算机。您无法收到条目通知 写在远程计算机上。
EventLog myNewLog = new EventLog("Application", ".", "testEventLogEvent");
myNewLog.EntryWritten += new EntryWrittenEventHandler(MyOnEntryWritten);
myNewLog.EnableRaisingEvents = true;
与尝试轮询EventLog管道相比,这大概是一种更轻松的方法
答案 1 :(得分:0)
我通过MSDN工作自己找到了解决方案。这是针对将来可能会来到这里的人们的,EntryWrittenEventHandler是解决方案。
尽管我刚才想添加的答案是正确的,但是您可以使用EventLogWatcher为管理日志以外的日志添加事件处理程序。