首页 > 解决方案 > 如何仅读取添加到事件日志中的新事件?

问题描述

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

标签: c#windowswinapievent-log

解决方案


你可以这样做

EventLog appLogs = new EventLog("Application");

var entries = appLogs.Entries.Cast<EventLogEntry>()
                     .Where(x => x.TimeWritten >= DateTime.Now.AddMinutes(-60))
                     .ToList();

但是,您过滤的时间无关紧要,仍然需要相同的时间。

我没有办法加快速度(我知道)

虽然您可能想查看EventLog.EntryWritten 事件

在将条目写入本地计算机上的事件日志时发生。

备注

要获取事件通知,您必须将 EnableRaisingEvents 设置为 true。只有在本地计算机上写入条目时,您才能收到事件通知。您无法接收远程计算机上写入的条目的通知。

EventLog myNewLog = new EventLog("Application", ".", "testEventLogEvent");                 

myNewLog.EntryWritten += new EntryWrittenEventHandler(MyOnEntryWritten);
myNewLog.EnableRaisingEvents = true;

据推测,这将比尝试轮询 EventLog Plumbing 更轻松


推荐阅读