无法通过通过Jenkins触发的PHP exec()调用的nagios check_logwarn插件命令捕获对日志文件的更改

我使用
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文档提到支持否定检查表达式.

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

点赞