Я пытаюсь получить самые последние события из журнала событий. Я нашел этот ответ Чтение журнала событий от новейшего к старому , но он включает загрузку всего журнала, которого я хочу избежать.
Так что я попробовал перейти в конец журнала, сначала так:
var eventLog = EventLog.GetEventLogs().OfType<EventLog>().Single(el => el.Log == "Security");
int logSize = eventLog.Entries.Count;
var lastScanTime = DateTime.Now.AddDays(-1),
for (int i = logSize - 1; i >= 0; i--)
{
var entry = eventLog.Entries[i];
if (entry.TimeWritten <= lastScanTime)
{
break;
}
entry.Dump();
}
Это работает некоторое время, но если я продолжаю его запускать, я начинаю получать IndexOutOfRangeExceptions
Похоже, что eventLog.Entries.Count больше не соответствует количеству записей, которое вы можете проверить с помощью следующего кода:
var eventLog = EventLog.GetEventLogs().OfType<EventLog>().Single(el => el.Log == "Security");
int size = eventLog.Entries.Count.Dump();
int size2 = eventLog.Entries.Cast<EventLogEntry>().ToList().Count.Dump();
Два значения размера возвращают разные значения. Entries.Count продолжает расти, но количество записей в списке перестает расти. Количество также соответствует тому, что я вижу в средстве просмотра журнала событий Windows.
Это похоже на разрывы API .net, и больше нет доступных событий.
Кто-нибудь видел это раньше или есть какие-то исправления, чтобы этот подход заработал.
Редактировать: Я также нашел это Загадочное исключение IndexOutOfRange, повторяющееся при чтении из полного EventLog , которое кажется похожей проблемой, но не имеет решения. Я не могу использовать события, потому что, возможно, я слежу за активностью на компьютере до установки моего программного обеспечения.
Редактировать: если я ловлю исключения и помещаю результаты в список, я снова получаю другое количество событий:
var results = new List<EventLogEntry>();
for (int i = eventLog.Entries.Count; i >= 0; i--)
{
try
{
var entry = eventLog.Entries[i];
{
results.Add(entry);
}
}
catch (Exception ex) { }
}
У него меньшее количество записей, чем у Entries.Count, но более новые записи в журналах, чем у Entries, которые, кажется, только что остановились в определенный момент.