【问题标题】:Reliably get Latest Event Log Record with WQL使用 WQL 可靠地获取最新的事件日志记录
【发布时间】:2010-10-04 14:08:47
【问题描述】:

我编写了一个应用程序,它通过 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 远程调用的。有谁知道我如何在我的场景中实现这一点?

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • Mitch,感谢您的回答,但是您能否指出我从 linux 远程调用 WinAPI 函数的正确方向?我一开始就想这样做,但不知道如何从我的 CentOS Linux 机器上调用这些函数。
    • 你可以通过 RPC 来完成,他们在 SAMBA 中完成。看看 SAMBA 中的 rpcclient。
    【解决方案2】:

    您需要最新记录的 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_'
    

    这个

    【讨论】:

      猜你喜欢
      • 2013-11-26
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      相关资源
      最近更新 更多