Надежно получить последнюю запись журнала событий с WQL
Вопрос
Я написал приложение, которое собирает журналы 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_'
Время выполнения этого <= чем в общем случае.