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

标签 php jenkins nagios aws-code-deploy

我正在使用 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,问题仍然可以一致地重现,在案例 2 中,我通过 Jenkins 触发项目,并且该文件在 AWS 代码部署的 Hook 之一中被调用。

嗯,看来这件事不会那么容易解决。手动调用 PHP 文件的问题已得到修复,但在通过 Jenkins 调用时,我仍然始终遇到同样的问题。

最佳答案

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

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

关于php - 无法通过通过 Jenkins 触发的 PHP exec() 调用的 nagios check_logwarn 插件命令捕获对日志文件的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42906177/

相关文章:

php - Composer - 请求包 [0.0.9] 作为 [0.0.5,0.0.6] 存在,但这些被您的约束拒绝

javascript - 根据图像在 WordPress 中的方向向图像添加类

jenkins - 平行小组赛

jenkins - 某些插件阻止 Jenkins 邮件工作

python - 导入错误 : PyCapsule_Import could not import module "pyexpat"

vim - 如何将以空格作为唯一分隔符的段落表格化

linux - Nagios - bash 脚本的状态未知

perl - 不能使用未定义的值作为 HASH 引用

php/mysql 邮政编码邻近搜索

php - 如何在 PHP 和 MySQL 中同时将数据插入到两个或多个表中?