Отсутствуют записи API журнала событий - PullRequest
0 голосов
/ 02 июля 2018

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

Так что я попробовал перейти в конец журнала, сначала так:

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, которые, кажется, только что остановились в определенный момент.

1 Ответ

0 голосов
/ 09 июля 2018

В случае, если у кого-то еще есть такая же проблема, это кажется результатом не всегда удаления объекта EventLog после чтения из файла.

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

...