2010-10-04 6 views
2

Я написал приложение, которое собирает окна журналов из linux через пакет wmi-client Zenoss.Надежно получить последнюю запись журнала событий с помощью WQL

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

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

Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application' 

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

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

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

Update

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

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

Благодаря

ответ

1

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

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

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

+0

Mitch, Спасибо за ваш ответ, однако вы могли бы указать мне в правильном направлении для удаленного вызова функций WinAPI из linux? Я хотел сделать это в первую очередь, но не мог понять, как назвать эти функции с моего компьютера CentOS Linux. –

+0

Вы можете сделать это через RPC, они делают это в SAMBA. Взгляните на rpcclient в SAMBA. –

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^