在 Nagios 中,可以轻松检查过去 48 小时内发生的日志消息并发出警报。
但是我该如何配置 Nagios,让它在过去 48 小时内没有消息时发出警报?为什么这么难?
我正在使用“检查 WMI Plus”插件(不需要代理)来检查 Windows 机器上的事件日志。
答案1
我认为问题实际上是关于如何构造 WMI 查询,以便在没有返回结果时返回 true。(我会将“WQL”或“WMI”或两者作为标签添加到问题中)。
获得 WMI 查询经验的最佳方法之一是从 Microsoft 下载 WMI Code Creator。当然,您必须在 Windows 机器上运行它,但您可以使用 GUI 集中精力处理需要输入 Nagios 插件的查询。
http://www.microsoft.com/en-us/download/confirmation.aspx?id=8572
WMI 使用的查询语言是 WMI 查询语言 (WQL),与 SQL 类似,您可以查询过去 48 小时内是否存在特定事件代码。以下是一些有关 WQL 可接受语法的有用链接。
WQL 关键字:关联
WQL 运算符:关联
WQL 支持的日期格式:关联
命名空间:root\CIMV2
事件类:[取决于您具体要查找的内容]
目标类:Win32_NTLogEvent 关联
您将使用最常见的 root\CIMV2 命名空间,并且您需要的类是 Win32_NTLogEvent 类,用于获取您正在寻找的信息。其余的只是查询的结构。
由于我们不知道您正在寻找哪个特定事件,因此您可以使用几个属性来更改查询。
日志文件 = 您想查看哪个事件日志?“应用程序”或“系统”等...
用户 = 谁生成了事件?“NT AUTHORITY\SYSTEM”或者也许您正在专门寻找某个人。
您可以使用 WHERE 子句缩小查询范围,就像在 SQL 中一样,使用 TimeGenerated 属性。TimeGenerated 采用 IntervalFormat(或 UTC 格式)关联。
这是使用 WMI 处理日期和时间的快速指南。关联
其中 DateDiff("hh",TimeGenerated,GetDate()) < 48
所以把所有这些放在一起看起来应该是这样的。
SELECT * FROM Win32_NTLogEvent WHERE EventCode=4001
AND DateDiff(hh,TimeGenerated,GetDate()) < 48
4001 只是一个虚构的数字,查找您想要查询的事件 ID。;)
您可以添加其他 AND 语句以包含属性,从而根据需要缩小结果范围。除了 Phil 的回答之外,这应该可以帮您找到所需的内容。
答案2
我对 WMI 没有太多经验,所以我不确定从事件日志中获取内容的查询如何进行,但假设您可以编写该部分(并且您表明您可以),您可以使用 Check WMI Plus 设置匹配日志消息数量的较低阈值,如下所示:
[section check]
query=SELECT * FROM <your query here ...>
test=_ItemCount
display=_DisplayMsg||~|~| - ||
display=_ItemCount|#
perf=_ItemCount||Log Entries
有了这些,你可以运行check_wmi_plus.pl
并-c 1:
返回 CRITICAL 状态,如果存在更少发现超过一个日志条目。(有关 Check WMI Plus 中阈值的更多信息,请参阅“你能给我展示一些警告/关键标准的示例吗?“。”)
答案3
这并不难。你可以将你的典型日志检查与标准否定插件为了达成这个。