我编写了一个应用程序,通过 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_'

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top