功能需求:
监控日志文件出现指定关键词时,进行报警。
每次只监控新增日志的内容,防止已经修复的问题报警一直存在导致新的报警不再被观察到。
脚本
logChange.sh
#!/bin/bash
logfile="/data/logs/catalina.out" #日志文件路径
recordfile="/tmp/logchange.tmp" #临时文件,记录行数
keywords=("Connection reset") #关键字,是个arrary,可以填写多个
if [ -f $recordfile ];
then
last_line_count=`cat $recordfile`;
else
echo "0" > $recordfile;
last_line_count="0";
fi
current_line_count=`wc -l $logfile|awk '{print $1}'`;
if [ $current_line_count -eq $last_line_count ];
then
echo "OK, no chang found from logfile";exit 0; #日志发现没有更新
elif [ $current_line_count -lt $last_line_count ];
then
echo "0" > $recordfile;
echo "OK, logfile recreated";exit 0; #日志发现被重新创建从0行开始计算
elif [ $current_line_count -gt $last_line_count ];
then
for keyword in "${keywords[@]}"
do
isMatch=`tail -n +$last_line_count $logfile|grep "$keyword"`;
if [ -n "$isMatch" ];then
echo "Critical, log match keyword:"$keyword; #发现关键字报错
echo $current_line_count > $recordfile;
exit 2;
fi
done
echo "OK, log not match keywords"; #日志中没有关键字
echo $current_line_count > $recordfile;
exit 0;
fi
参数说明:
logfile:被监控的日志文件
recordfile:记录被监控日志文件上次读取的行数
keywords:监控的关键字,判断更新的日志中是否出现keywords列表内的数据。
实际使用时候为了通用性,可以将日志文件路径,记录行数临时文件路径,和关键字作为参数传入。
监控端配置简单说明:
1、这里用的是nagios的监控,所以使用exit code来让系统判断日志是否有指定报错。日过使用zabbix或其他监控系统,请自行修改。
2、nagios存在retry机制,但实际上,如果监控发现异常,再第二次进行retry时将不会报错,也就不会提示用户报警信息,这样就让监控系统失效。所以需要将max_check_attempts设置为1。