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

Modifying regex match in nagios logwarn which matches against string, to not match if followed by another string

考虑到日志文件中的以下错误日志,我将其用作 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" 字符串 -

/^.*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

现在,我想做一个修改,如果"Fatal"后面有一个字符串"File not found: ",则忽略日志行的匹配,如上面的错误日志示例。

logwarn documentation 提到了对否定检查表达式的支持以及对同一命令中多个正则表达式的支持,就像这样 -

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'

在实际情况下,我会有多个文件路径,其对应的 "File not found" 错误需要被忽略。最好的解决方案也可以考虑。

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

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

Each log message is compared against each pattern in the order given. Negative patterns are specified with a ``!'' prefix. If the log message matches a positive pattern before matching a negative !pattern, or if none of the patterns match, then it's printed to standard output.

因此,每一行都按顺序 .

测试模式
  • 如果正模式匹配,则接受该行并且不再测试更多模式。
  • 如果否定模式匹配,则拒绝该行并且不再测试更多模式。
  • 如果到达列表末尾但没有模式匹配,该行将被拒绝。

您要查找包含A但不包含B的可以用AND函数表示的行:A·!B

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

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