2

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

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

我偶然发现了这个,它告诉我在这样的查询中使用 NumberOfRecords 列

Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application'

并将其返回值用作最高日志。

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

任何人都可以了解这实际上是如何工作的(NumberOfRecords 是最高的 RecordNumber,还是日志中的实际事件数),并可能提出解决方案?

更新

所以我们现在知道 NumberOfRecords 不能单独工作,因为 Event Log 是一个环形缓冲区。MS 解决方案是获取最旧的记录并将其添加到 NumberOfRecords 以获取实际的最新记录。

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

谢谢

4

2 回答 2

1

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

使用 win api 执行此操作的方法是获取最旧的记录号并添加日志中的记录数以获得最大记录数。看起来 Win32_NTEventLogFile 没有要使用的最旧记录编号字段。

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

于 2010-10-07T13:34:30.607 回答
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_'

这个<=的执行时间比一般情况下。

于 2014-12-23T13:51:16.113 回答