如何仅读取添加到事件日志中的新事件?

时间:2018-12-28 07:18:26

标签: c# windows winapi event-log

我正在研究一个项目,以读取和显示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:我只想听事件日志中新添加的事件,而不是整个事件日志

2 个答案:

答案 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为管理日志以外的日志添加事件处理程序。