远程事件记录分页

时间:2014-12-02 11:50:58

标签: c# asp.net linq event-viewer

我有以下要求

  • 阅读远程机器事件日志
  • 传递凭据
  • 允许用户在MVC应用程序中翻阅此页

根据我的研究,我相信可以使用EventLogSession结合EventLogQuery& EventLogReader

虽然我已经设法成功连接到具有凭据的远程计算机并读取了日志文件,但我仍然处于分页方面。我不知道怎么做相当于LINQ的Skip&使用EventLogQuery获取方法。

其中一些机器将具有> 20 000个日志,我想避免在分页之前将它们全部加载到内存中。

有没有办法用EventLogQuery实现分页?

1 个答案:

答案 0 :(得分:1)

这里有一个关于如何使用yield return的惰性评估功能来解决这个问题的想法。给定使用EventLogQuery执行的查询,您可以执行以下操作:

public IEnumerable<EventRecord> QueryEventRecords(string queryString)
{
    var query = new EventLogQuery("Application", PathType.LogName, queryString);
    using (var reader = new EventLogReader(query))
    {
        EventRecord eventRecord;
        while ((eventRecord = reader.ReadEvent()) != null)
        {
            yield return eventRecord;
        }
    }
}

然后您可以执行查询,然后在IEnumerable上使用您喜欢的LINQ运算符。

var result = QueryEventRecords("*[System[(Level = 3)]]")
    .Skip(10)
    .Take(10)
    .ToList();

也就是说,分页远程PC不会在MVC应用程序中飞行 - 在屏幕分页之间保留迭代器的状态是不可取的。最好的方法是从远程机器预先获取感兴趣的查询中的所有事件,而不是将它们保存到中央数据库(即类似于企业软件,如SCOM)。然后,您可以使用像EF这样的ORM浏览事件数据。