我使用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文档提到支持否定检查表达式.
请尝试在模式字符串之前预先挂起感叹号(!)以排除而不是包含这些匹配