Читать журнал событий от новейшего к старому - PullRequest
4 голосов
/ 11 августа 2011

Я написал короткую программу для установки времени работы удаленных ПК, используя сообщения журнала событий, которые публикуются при запуске и завершении работы. На данный момент логика такова:

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

«OldestTime» определяет, как далеко сканировать время назад ...

Я хотел бы знать, есть ли способ легко изменить мою программу, чтобы прочитать события от самых новых до самых старых?

Он читает удаленные журналы событий и требует времени для запуска этой функции, так как он запускается в конце и читает вперед.

Я знаю это, потому что я добавил блок «else» в первый «if», чтобы вырваться из блока foreach, если запись не в пределах временного интервала, который мы ищем, и остановка программы при первом событии, которое она читает.

Ответы [ 2 ]

3 голосов
/ 16 июля 2013

Прошло много времени с тех пор, как вы задавали этот вопрос, но я столкнулся с той же проблемой и нашел решение.

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 на строку с именем компьютера, с которого вы хотите события, и изменить «Приложение» на журнал, который вы хотите видеть.Я думаю, что "Система" в вашем случае.

0 голосов
/ 11 августа 2011

Лучшим решением может быть перемещение данных в список, а затем обратный порядок. Примерно так:

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

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

eventList.Reverse();

Это должно привести к получению данных в обратном порядке, т. Е. Сначала к последнему, а затем вы можете просто обработать их, как и раньше, но на этот раз выйдите из цикла, когда вы достигнете даты до самого старого времени.

Это не идеальное решение, так как вы все еще обрабатываете весь журнал, но, возможно, стоит попробовать, если вы улучшите производительность

...