无法使用 nginx logwarn 正确解析包含特定关键字的日志行

Unable to correctly parse out log lines containing particular keyword using nginx logwarn

在最后一次调用 check_logwarn 命令后添加了以下日志行 -

[Tue Nov 22 11:04:03 2016] [hphp] [10755:7f41af3ff700:6272:000001] [] SlowTimer [2086ms] at runtime/ext_m
ysql: slow query: SELECT b.bannerid, b.campaignid FROM ox_banners b, ox_campaigns c WHERE b.campaignid =
c.campaignid AND (b.status = 0 OR b.`updated` >= now() - INTERVAL 7 DAY) AND (c.status = 0 OR c.`updated`
 >= now() - INTERVAL 7 DAY)  AND b.updated >= '2016-11-22 11:03:01';

以下 logwarn 命令查找 SlowTimer,如我所料找到匹配的日志(输出是在上次调用命令后添加的整个日志行)-

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

但是,以下查找 SlowTimers 的命令也找到了匹配的日志,这是我不希望的 -

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

我在 https://regex101.com/ 上测试了正则表达式,/.*SlowTimer.*/g 匹配,而 /.*SlowTimers.*/g 不匹配任何东西。我认为这是非常简单的正则表达式,并且在各种风格中的工作方式相似。

当命令找不到任何匹配项时(例如,在上次调用后没有新的日志行时),这是我得到的输出 -

OK: No log errors found

当我查找 .*SlowTimers.* 时,我期待上面的输出。

请参考logwarn Manual

认为您可能需要使用 -p 标志:

 -p      Change default match behavior to non-matching.  By default, if a log
         message doesn't match any of the positive or negative patterns, it is
         considered a match.  This flag reverses this behavior so that these
         messages are considered non-matches.

我也可能错了,但我认为正则表达式可以简化为 SlowTimers 而不是 .*SlowTimers.*。它没有指定开始 (^) 和结束 ($),因此可以出现在文本中的任何位置。