无法通过 nagios 捕获对日志文件的更改check_logwarn插件命令通过 PHP exec() 通过 Jenk



我正在使用nagios check_logwarn来捕获对日志文件的更改。

为了测试我的设置,我一直在手动将以下日志行添加到相关日志文件中 -

[Mon Mar 20 14:24:31 2017] [hphp] [12082:7f238d3ff700:32:000001] []
nFatal error: entire web request took longer than 10 seconds and timed out in /var/cake_1.2.0.6311-beta
app/webroot/openx/www/delivery/postGetAd.php on line 483

上面的内容应该被下面的nagios命令捕获,因为它包含关键字"Fatal">

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

输出(如预期) -

Log errors: nFatal error: entire web request took longer than 10 seconds and timed out in /var/cake_1.2.
0.6311-beta
nFatal error: entire web request took longer than 10 seconds and timed out in /var/cake_1.2.0.6311-beta

直接运行此命令有效(案例 1),但似乎通过通过 Jenkins 项目触发的 PHP exec 调用相同的命令并没有捕获相同的命令(案例 2)。

以下是案例 2 的 PHP 代码 -

$errorLogCommand = '/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn_hiphop_error -p /mnt/log/hiphop/error_'.$date.'.log "^.*Fatal*"';
$output = exec($errorLogCommand);
file_put_contents('/var/cake_1.2.0.6311-beta/deployment/deployment.log', "n ".date("Y-m-d H:i:s")." Checked error key words in error_".$date.".log. command -> ".$errorLogCommand, FILE_APPEND);
if($output!="OK: No log errors found")
{
file_put_contents('/var/cake_1.2.0.6311-beta/deployment/deployment.log', "n ".date("Y-m-d H:i:s")." - Hiphop errors -> ".$output, FILE_APPEND);
$failure=true;
break;
}
else
{
file_put_contents('/var/cake_1.2.0.6311-beta/deployment/deployment.log', "n ".date("Y-m-d H:i:s")." - No Error found -> ".$output, FILE_APPEND);
}

以下是输出 -

2017-03-20 14:16:45 Checked error key words in error_20170320.log. command -> /usr/local/nagios/libexec/
check_logwarn -d /tmp/logwarn_hiphop_error -p /mnt/log/hiphop/error_20170320.log "Fatal"
2017-03-20 14:16:45 - No Error found -> OK: No log errors found

请注意,使用与案例 1 相同的 nagios 命令 (/usr/local/nagios/libexec/check_logwarn),在这种情况下意外地未检测到日志错误。

以下是我对 nagios 生成的内部跟踪器文件内容的观察 -/tmp/logwarn_hiphop_error/mnt_log_hiphop_error_20170320.log-

在案例 1 中检测到错误时,以下是文件中的更改 -

运行命令之前

# logwarn 1.0.10 state for "/mnt/log/hiphop/error_20170320.log"
INODENUM="1208110246"
LINENUM="110"
POSITION="111627"
MATCHING="true"

运行命令后

# logwarn 1.0.10 state for "/mnt/log/hiphop/error_20170320.log"
INODENUM="1208110246"
LINENUM="116"
POSITION="112087"
MATCHING="false"

此外,以下是案例 2 中对同一文件的更改 -

运行 php 文件之前

# logwarn 1.0.10 state for "/mnt/log/hiphop/error_20170320.log"
INODENUM="1208110246"
LINENUM="102"
POSITION="109329"
MATCHING="true"

# logwarn 1.0.10 state for "/mnt/log/hiphop/error_20170320.log"
INODENUM="1208110246"
LINENUM="110"
POSITION="111627"
MATCHING="true"

我不确定为什么MATCHING参数在情况 2 中为真,而在情况 1 中为假。事实上,错误匹配发生在案例 1 中。

更新

我尝试将命令包装在escapeshellcmd中,以确保正则表达式不会被剥离 -

$output = exec(escapeshellcmd($errorLogCommand)); 

但输出仍然没有变化。

更新 2

发现我在手动添加的日志行中有换行符。删除这些修复了从命令行运行 PHP 文件的情况一致。但是,对于案例 2,该问题仍然可以一致重现,我通过 Jenkins 触发项目,并且此文件在 AWS 代码部署的一个钩子中被调用。

好吧,这似乎不会那么容易解决。手动调用 PHP 文件的问题得到了修复,但在通过 Jenkins 调用时,我仍然始终遇到同样的问题。

logwarn 文档提到了对否定检查表达式的支持。

请尝试在模式字符串之前预置感叹号 (!) 以排除,而不是包含这些匹配项

最新更新