从最新到最旧读取事件日志

问题描述 投票:0回答:3

我编写了一个简短的程序,使用启动和关闭时发布的事件日志消息来确定远程 PC 的正常运行时间。目前的逻辑是:

  foreach (eventlogentry)
  {
       if (entryTime > OldestTime)
       {
            if (entry = Startup)
            {
                 addOnTime(entry.Time);
            }
            if (entry = Shutdown)
            {
                 addOffTime(entry.Time);
            }
       }
  }

“OldestTime”定义时间向后扫描多远....

我想知道是否有办法轻松修改我的程序以从最新到最旧的顺序读取事件?

它正在读取远程事件日志,并且该函数需要一段时间才能运行,因为它从末尾开始并向前读取。

我知道这一点是因为我在第一个“if”中添加了一个“else”块来突破 foreach 块,如果该条目不在我们正在查找的时间跨度内并且程序在它读取的第一个事件处停止。

c# .net windows event-log
3个回答
5
投票

你问这个问题已经有一段时间了,但我遇到了同样的问题并找到了解决方案。

using System.Diagnostics;
using System.Linq;

EventLog events = new EventLog("Application", System.Environment.MachineName);
foreach (EventLogEntry entry in  events.Entries.Cast<EventLogEntry>().Reverse())
{
    //Do your tasks
}

这个 awnser 仍然不如向前枚举它那么快,但它比使用循环将项目复制到列表要优雅一些。

@leinad13,对于您的应用程序,您需要将 System.Environment.MachineName 更改为包含您想要事件的计算机名称的字符串,并将“Application”更改为您想要查看的日志。我认为你的情况是“系统”。


0
投票

您最好的解决方案可能是将数据移动到列表中,然后颠倒顺序。类似于以下内容:

EventLog eventLog = new EventLog();
eventLog.Log = myEventLog;
var eventList = new List<EventLogEntry>();

foreach(EventLogEntry entry in eventLog.Entries)
{
      eventList.Add(entry);
}

eventList.Reverse();

这应该以相反的顺序获取数据,即首先获取最新的数据,然后您可以像以前一样处理它,但是这次当您点击最旧时间之前的日期时退出循环。

这不是一个理想的解决方案,因为您仍在处理整个日志,但可能值得尝试一下,看看性能是否有所提高


0
投票

对于任何来到这里只是获取自某个进程启动(部署或类似的事情)以来的最后日志的人。

没有必要迭代整个列表。这将获取最后 X 个事件:

private static EventLogEntry[] GetLastEventLogs(int numberOfEntries, bool ascending = false)
{
    List<EventLogEntry> events = new List<EventLogEntry>();
    EventLog eLog = new EventLog("Application", Environment.MachineName);
    int i = eLog.Entries.Count - numberOfEntries;
    for (int t = (i + numberOfEntries) - 1; t >= i; t--)
        events.Add(eLog.Entries[t]);

    if (ascending)
        events.Reverse();

    return events.ToArray();
}

我个人更喜欢使用开始日期。将

DateTime.Now
保留在变量中,以防出现故障。当它失败时,使用它来仅获取相关日志...

private static EventLogEntry[] GetLastEventLogs(DateTime fromTime, bool ascending = false)
{
    List<EventLogEntry> events = new List<EventLogEntry>();
    EventLog eLog = new EventLog("Application", Environment.MachineName);

    for (int t = eLog.Entries.Count - 1; t >= 0; t--)
    {
        EventLogEntry e = eLog.Entries[t];
        if (e.TimeGenerated > fromTime)
            break;
        events.Add(e);
    }

    if (ascending)
        events.Reverse();

    return events.ToArray();
}
© www.soinside.com 2019 - 2024. All rights reserved.