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

Regex 修改nagios logwarn中与字符串匹配的正则表达式匹配,如果后跟另一个字符串,则修改为不匹配,regex,nagios,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 下面的正则表达式非常适用于检测是否存在“致命”字符串- /^.*

考虑以下错误日志,在日志文件中,我将其用作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
现在,我想做一个修改,如果在“致命”后面有一个字符串“File not found:”,则忽略日志行的匹配,如上面的错误日志示例所示

提到了在同一个命令中支持负数检查表达式和多个正则表达式,如下所示-

logwarn -p -m '^myprog: ' '!retrying' 'ERROR' 
因此,我尝试了以下方法,但仍然没有给出所需的结果(仍然匹配文件不存在部分)-

在实际场景中,我将有多个文件路径,需要忽略其相应的“未找到文件”错误。最好的解决方案也可以考虑。


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

logwarn实用程序接受正正则表达式和负正则表达式的列表。发件人:

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

因此,每一行都按照模式的顺序进行测试

  • 如果阳性模式匹配,则接受该行,不再测试其他模式
  • 如果负模式匹配,则拒绝该行,不再测试其他模式
  • 如果到达列表末尾时没有模式匹配,则拒绝该行
您正在寻找包含A但不包含B的行,这些行可以用A和函数表示:A·!B

将模式列表指定为
A!B
将产生以下功能:A+!B


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

我不是logwarn方面的专家,但从文档来看,这些模式似乎是OR模式,因此如果第一个模式匹配(致命),那么第二个模式将被忽略,因此将这两个模式一起使用并不像您期望的那样有帮助。您可以使用否定表达式将第一个命令传递到另一个命令。据我所知,POXIS不支持否定表达式。@关于您的第一条评论,文档中给出的描述是“显示不包含
retrying',但包含
ERROR'的行,以及多行日志消息中的任何后续行,假设'myprog:'前缀标记每个新日志消息的开始。“所以,它似乎应该检查一下。关于否定表达式,logwarn支持它,我已经成功地使用了它。您需要首先指定否定模式。有关详细信息,请参阅。@RichardSmith您是对的!请继续并在答案中添加它,我将选择它作为最佳答案。顺便问一下,你从哪一行得出结论?我发现手册页太难理解了。请看看你是否能回答这个问题
/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn_hiphop_error -p /mnt/log/hiphop/error_20170118.log '^.*Fatal*' '!.*File not found\: \.\/postGetAd\.php'