2014-12-02 62 views
1

我有以下要求远程事件日志寻呼

  • 查看远程计算机的事件日志
  • 越过凭据
  • 允许用户翻阅这在MVC应用程序

从我的研究,我相信这可以使用EventLogSession加上EventLogQuery & EventLogReader

虽然我设法成功地使用凭证成功地连接到远程计算机并读取日志文件,但我仍然陷于分页方面。我不知道如何做相当于LINQ的Skip &带EventLogQuery的方法。

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

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

回答

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; 
     } 
    } 
} 

然后你就可以执行查询,然后使用自己喜欢的LINQ运营商在IEnumerable

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

也就是说,寻呼远程PC不会在MVC应用程序飞 - 护屏分页之间的迭代器的有状态不会是可取的。最好是从远程计算机中预先获取感兴趣的查询中的所有事件,并将其保存到中央数据库(即类似于企业软件,如SCOM)。然后,您可以使用EF等ORM在闲暇时浏览事件数据。