Надежно получить последнюю запись журнала событий с WQL
Я написал приложение, которое собирает журналы Windows из Linux через пакет wmi-client Zenoss.
Он использует WQL для запроса журнала событий и анализирует возврат. Моя проблема пытается найти последнюю запись в журнале.
Я наткнулся на это, что говорит мне использовать столбец NumberOfRecords в запросе, таком как этот
Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application'
и использовать возвращаемое значение из этого как самый высокий лог.
У меня вопрос, я слышал, что журнал событий Windows представляет собой кольцевой буфер, то есть он перезаписывает свои старые журналы новыми, когда журнал заполняется. Будет ли это влиять на NumberOfRecords, как если бы это произошло, свойство "RecordNumber" событий будет продолжать увеличиваться, однако фактическое количество записей в журнале событий не изменится (как и для каждой записанной записи, одна удаляется).
Может кто-нибудь пролить некоторую информацию о том, как это на самом деле работает (является ли NumberOfRecords наибольшим номером RecordNumber или фактическим числом событий в журнале), и, возможно, предложить решение?
Обновить
Итак, теперь мы знаем, что NumberOfRecords не будет работать сам по себе, поскольку журнал событий является кольцевым буфером. Решение MS состоит в том, чтобы получить Старую запись и добавить ее в NumberOfRecords, чтобы получить актуальную последнюю запись.
Это возможно через WinAPI, но я звоню удаленно из Linux. Кто-нибудь знает, как я могу добиться этого в моем сценарии?
Спасибо
2 ответа
NumberOfRecords не всегда будет максимальным номером записи, потому что журнал является круглым, и журнал может быть очищен, и у вас может быть 1 запись, но ее номер записи равен 1000.
То, как вы могли бы сделать это, используя win api, было бы получить самый старый номер записи и добавить количество записей в журнале, чтобы получить максимальное количество записей. Похоже, что Win32_NTEventLogFile имеет самое старое поле номера записи для использования.
Вы пытаетесь получить последнюю запись каждый раз, когда запрашиваете журнал? Вы можете использовать TimeGenerated при запросе Win32_NTLogEvent, чтобы получить все> СЕЙЧАС. Вы можете повторить этот список, чтобы найти ваш максимальный номер записи.
Вам нужен RecordNumber самой новой записи, но нет быстрого способа получить его. Как правило, вы должны:
SELECT RecordNumber FROM Win32_NTLogEvent WHERE LogFile='Application'
И найдите максимальный RecordNumber через результаты. Но это может занять десятки секунд или минут, если размер файла журнала большой... он очень медленный.
Но! Вы можете получить количество записей:
SELECT NumberOfRecords FROM Win32_NTEventlogFile WHERE LogfileName='Application'
Это очень быстро. А затем уменьшите выбор, чтобы ускорить поиск самой новой записи:
SELECT RecordNumber FROM Win32_NTLogEvent WHERE LogFile='Application' AND RecordNumber>='_number_of_records_'
Время выполнения этого <=, чем в общем случае.