在nagios logwarn中修改与字符串匹配的正则表达式匹配,如果后跟另一个字符串则不匹配

时间:2017-01-18 10:00:40

标签: regex nagios

在日志文件中考虑以下错误日志,我将其用作nagios logwarn命令的输入 -

[19910:7f88e07ff700:559445:000001] [] \nFatal error: File not found: ./postGetAds.php in /var/cake_1.2.0.6311-beta/app/webroot/openx/www/delivery/androidGetAd.php on line 302

以下正则表达式完美无缺,可以检测出"致命"字符串存在 -

/^.*Fatal*/g

这是完整的nagios logwarn命令,我使用上面的正则表达式 -

/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn_hiphop_error -p /mnt/log/hiphop/error_`(date +'%Y%m%d')`.log "^.*Fatal*"

这是输出,正如目前所希望的那样 -

Log errors: [Thu Jan 12 07:46:38 2017] [hphp] [19910:7f89543ff700:558024:000001] [] \nFatal error: File not found: ./postGetAd.php in /var/cake_1.2.0.6311-beta/app/webroot/openx/www/delivery/androidGetAd.php on line 302

现在,我想进行修改,如果有字符串"找不到文件,则忽略日志行的匹配:"跟随"致命",如上例中的错误日志。

logwarn documentation提到支持否定检查表达式并支持同一命令中的多个regexpressions,如下所示 -

logwarn -p -m '^myprog: ' '!retrying' 'ERROR' 

所以,我尝试了以下内容,但仍未达到预期效果(仍然匹配文件不存在部分) -

/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn_hiphop_error -p /mnt/log/hiphop/error_20170118.log '^.*Fatal*' '!.*File not found\: \.\/postGetAd\.php'

在实际情况中,我会有多个文件路径,其中找不到相应的"文件"错误需要忽略。最好的解决方案也可以考虑这一点。

注意 - 这里的正则表达式是POSIX风格。

1 个答案:

答案 0 :(得分:1)

logwarn实用程序接受正面和负面正则表达式的列表。来自the manual page

  

按照给定的顺序将每个日志消息与每个模式进行比较。   负模式用“!”前缀指定。如果是日志   在匹配否定之前,消息匹配正模式   !图案,或者如果没有任何图案匹配,则将其打印到   标准输出。

因此,每个行都按照按顺序进行测试。

  • 如果正模式匹配,则接受该行并且不再测试模式。
  • 如果否定模式匹配,则拒绝该行,并且不再测试模式。
  • 如果在没有模式匹配的情况下到达列表的末尾,则该行被拒绝。

您正在寻找包含A但不包含B的行,这些行可以用AND函数表示:A·!B

将模式列表指定为A !B将导致函数:A +!B

而以相反顺序!B A指定模式将导致函数:A·!B