使用WQL可靠地获得最新事件日志记录

时间:2010-10-04 14:08:48

标签: wmi wmi-query wql event-log zenoss

我编写了一个应用程序,它通过Zenoss wmi-client软件包从linux收集Windows日志。

它使用WQL查询事件日志并解析返回。我的问题是试图找到日志中的最新条目。

我偶然发现this告诉我在查询中使用NumberOfRecords列

Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application'

并使用其中的返回值作为最高日志。

我的问题是,我听说Windows事件日志是一个循环缓冲区,它会在日志满了时用新的日志覆盖它最旧的日志。这会对NumberOfRecords产生影响,就好像发生这种情况一样,事件的“RecordNumber”属性将继续增加,但事件日志中的实际记录数不会改变(对于每个写入的条目,一个被删除) )。

任何人都可以了解这实际上是如何工作的(无论NumberOfRecords是最高的RecordNumber,还是日志中的实际事件数),也许可以建议一个解决方案?

更新

因此我们现在知道NumberOfRecords不会自行运行,因为事件日志是一个环形缓冲区。 MS解决方案是获取最早的记录并将其添加到NumberOfRecords以获取实际的最新记录。

这可以通过WinAPI实现,但我是从Linux远程调用的。有谁知道我在我的场景中如何实现这一目标?

由于

2 个答案:

答案 0 :(得分:1)

NumberOfRecords并不总是最大记录数,因为日志是循环的,日志可以清除,你可以有一个条目,但它的记录号是1000。

使用win api执行此操作的方法是获取最早的记录编号,并在日志中添加记录数以获取最大记录编号。它看起来不像Win32_NTEventLogFile有一个最旧的记录号字段要使用。

每次查询日志时,您是否尝试获取最新记录?查询Win32_NTLogEvent以获取所有内容时,可以使用TimeGenerated>现在。您可以迭代该列表以查找最大记录编号。

答案 1 :(得分: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_'

执行时间< =比一般情况。