2014-12-02 4 views
1

У меня есть следующие требованияRemote Event Logs Paging

  • Почитайте удаленные машины журналы событий
  • Pass над учетными
  • позволяют пользователю пролистать это в MVC Application

Из моих исследований я считаю, что это может быть достигнуто с использованием EventLogSession в сочетании с EventLogQuery & EventLogReader.

Несмотря на то, что мне удалось успешно подключиться к удаленной машине с учетными данными и прочитать файлы журнала, я застрял в аспект пейджинга. Я не знаю, как сделать эквивалент LINQ's 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(); 

Тем не менее, пейджинг удаленный компьютер не собирается летать в приложении MVC - сохранение statefulness итератора между экраном подкачки не рекомендуется. Лучше было бы предварительно получить все события в интересующем запросе с удаленных компьютеров и вместо этого сохранить их в центральной базе данных (например, аналогично корпоративному программному обеспечению, например SCOM). Затем вы можете просматривать данные о событиях в свободное время, используя ORM, например EF.