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

StackOverflow https://stackoverflow.com/questions/3856025

Вопрос

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

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

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

Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application'

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

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

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

Обновлять

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

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

Спасибо

Это было полезно?

Решение

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

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

Вы пытаетесь получить последнюю запись каждый раз, когда вы запрашиваете журнал? Вы можете использовать TimeGenerated, когда вы запрашиваете Win32_ntlogevent, чтобы получить все> сейчас. Вы можете получить этот список, чтобы найти номер Max Record.

Другие советы

Вам нужен рекордник о новейшей записи, но нет быстрого способа получить его. Вообще, вам нужно:

SELECT RecordNumber FROM Win32_NTLogEvent WHERE LogFile='Application'

И найдите Max Regionnumber через результаты. Но это может принять десятки секунд или минут, если размер файла журнала большой ... Это очень медленно.

Но! Вы можете получить количество записей:

SELECT NumberOfRecords FROM Win32_NTEventlogFile WHERE LogfileName='Application'

Это очень быстро. А затем уменьшить выбор для ускорения поиска новейшей записи:

SELECT RecordNumber FROM Win32_NTLogEvent WHERE LogFile='Application' AND RecordNumber>='_number_of_records_'

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top