使用 WQL 可靠地获取最新的事件日志记录
题
我编写了一个应用程序,通过 Zenoss wmi-client 包从 Linux 收集 Windows 日志。
它使用 WQL 查询事件日志并解析返回。我的问题是试图找到日志中的最新条目。
我偶然发现 这 它告诉我在这样的查询中使用 NumberOfRecords 列
Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application'
并将其返回值用作最高日志。
我的问题是,我听说 Windows 事件日志是一个循环缓冲区,即当日志已满时,它会用新日志覆盖最旧的日志。这是否会对 NumberOfRecords 产生影响,如果发生这种情况,事件的“RecordNumber”属性将继续增加,但事件日志中的实际记录数不会改变(对于写入的每个条目,都会删除一个) )。
任何人都可以深入了解它的实际工作原理(NumberOfRecords 是最高的 RecordNumber,还是日志中的实际事件数),并可能提出解决方案?
更新
现在我们知道 NumberOfRecords 无法单独工作,因为事件日志是一个环形缓冲区。MS 的解决方案是获取最旧的记录并将其添加到 NumberOfRecords 中以获取实际的最新记录。
这可以通过 WinAPI 实现,但我是从 Linux 远程调用。有谁知道我在我的场景中如何实现这一目标?
谢谢
解决方案
NumberOfRecords 并不总是最大记录数,因为日志是循环的并且日志可以被清除,并且您可能有 1 个条目,但其记录数为 1000。
使用 win api 执行此操作的方法是获取最旧的记录号,然后添加日志中的记录数以获得最大记录号。Win32_NTEventLogFile 看起来没有最旧的记录号字段可供使用。
你是否每次查询日志时都试图获取最新的记录?当您查询 Win32_NTLogEvent 来获取所有内容时,您可以使用 TimeGeneerated > NOW。您可以迭代该列表以查找最大记录数。
其他提示
您需要最新记录的 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_'
这个 <= 的执行时间比一般情况要多。