我编写了一个应用程序,它通过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远程调用的。有谁知道我在我的场景中如何实现这一目标?
由于
答案 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_'
执行时间< =比一般情况。