Надежно получить последнюю запись журнала событий с WQL - PullRequest
2 голосов
/ 04 октября 2010

Я написал приложение, которое собирает журналы Windows из Linux через пакет wmi-client Zenoss.

Он использует WQL для запроса журнала событий и анализирует возврат. Моя проблема пытается найти последнюю запись в журнале.

Я наткнулся на этот , который говорит мне использовать столбец NumberOfRecords в запросе, таком как этот

Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application'

и используйте возвращаемое значение из этого как самый высокий лог.

Мой вопрос: я слышал, что журнал событий Windows представляет собой кольцевой буфер, то есть он перезаписывает свои старые журналы новыми, когда журнал заполняется. Будет ли это влиять на NumberOfRecords, как если бы это произошло, свойство «RecordNumber» событий будет продолжать увеличиваться, однако фактическое количество записей в журнале событий не изменится (как и для каждой записанной записи, одна удаляется ).

Может кто-нибудь пролить некоторый взгляд на то, как это на самом деле работает (является ли NumberOfRecords наибольшим номером записи или фактическим числом событий в журнале), и, возможно, предложить решение?

Обновление

Итак, теперь мы знаем, что NumberOfRecords не будет работать сам по себе, поскольку журнал событий является кольцевым буфером. Решение MS состоит в том, чтобы получить Старую запись и добавить ее в NumberOfRecords, чтобы получить актуальную последнюю запись.

Это возможно через WinAPI, но я звоню удаленно из Linux. Кто-нибудь знает, как мне добиться этого в моем сценарии?

Спасибо

Ответы [ 2 ]

1 голос
/ 07 октября 2010

NumberOfRecords не всегда будет максимальным номером записи, потому что журнал циклический и журнал может быть очищен, и у вас может быть 1 запись, но ее номер записи равен 1000.

Способ, которым вы могли бы сделать это, используяwin api будет для получения самого старого номера записи и добавления количества записей в журнале, чтобы получить максимальное количество записей.Не похоже, что Win32_NTEventLogFile имеет поле с самым старым номером записи.

Пытаетесь ли вы получать последнюю запись каждый раз, когда запрашиваете журнал?Вы можете использовать TimeGenerated при запросе Win32_NTLogEvent, чтобы получить все> СЕЙЧАС.Вы можете повторить этот список, чтобы найти ваш максимальный номер записи.

0 голосов
/ 23 декабря 2014

Вам нужен 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_'

Время выполнения этого <=, чем в общем случае. </p>

...