我在用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
直接运行此命令即可工作(case 1),但似乎通过 Jenkins 项目触发的 PHP exec 调用相同的内容并没有捕获相同的内容(case 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
请注意,使用相同的 nagios 命令(/usr/local/nagios/libexec/check_logwarn
)与情况 1 一样,在这种情况下未检测到日志错误,出乎意料。
以下是我对 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"
After
# logwarn 1.0.10 state for "/mnt/log/hiphop/error_20170320.log"
INODENUM="1208110246"
LINENUM="110"
POSITION="111627"
MATCHING="true"
我不知道为什么MATCHING
参数在情况 2 中为 true,而在情况 1 中为 false。事实上,错误匹配发生在情况1中。
Update
我尝试将命令包装在escapeshellcmd
,以确保正则表达式不会被删除 -
$output = exec(escapeshellcmd($errorLogCommand));
但输出仍然没有变化。
Update 2
发现我手动添加的日志行中有换行符。删除这些内容可以一致地修复从命令行运行 PHP 文件的情况。然而,对于情况 2,问题仍然可以一致地重现,在这种情况下,我通过 Jenkins 触发项目,并且该文件在 AWS 代码部署的挂钩之一中被调用。
嗯,看来这件事不会那么容易解决。手动调用 PHP 文件的问题已得到解决,但通过 Jenkins 调用时,我仍然遇到同样的问题。