Надежно получить последнюю запись журнала событий с WQL

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

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

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

Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application'

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

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

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

Обновить

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

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

Спасибо


person Greg Olmstead    schedule 04.10.2010    source источник


Ответы (2)


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

Это можно сделать с помощью Win api, чтобы получить номер самой старой записи и добавить количество записей в журнал, чтобы получить максимальное количество записей. Не похоже, что Win32_NTEventLogFile имеет самое старое поле номера записи для использования.

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

person Mitch    schedule 07.10.2010
comment
Митч, спасибо за ответ, но не могли бы вы указать мне правильное направление для удаленного вызова функций WinAPI из Linux? Я хотел сделать это в первую очередь, но не мог понять, как вызывать эти функции с моей машины CentOS Linux. - person Greg Olmstead; 08.10.2010
comment
Вы можете сделать это через RPC, они делают это в SAMBA. Взгляните на rpcclient в SAMBA. - person Mitch; 09.10.2010

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

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

person slasla    schedule 23.12.2014