监控需求:监控应用输出的错误日志,不需要太复杂的日志监控系统,程序有异常错误日志要企业微信告警出来。这个shell监控了日志文件的行号 有变动就将新增的日志内容发送企业微信告警, 用crontab 挂1分钟执行1次监控。
#!/bin/bash
set -u -e
#监控脚本存放目录 $0.log用于记录上一次读取日志的行号
mkdir -p /sh
cd /sh
if [[ ! -f $0.log ]];then
touch $0.log
fi
#发企业微信告警
wx(){
cat > $0.msg << EOF
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "text",
"text": {
"content": "$1",
}
}'
EOF
sh $0.msg && rm -rf $0.msg
}
#in 后面是需要监控的日志文件 需用绝对路径
for logfile in /data/logs/sdk-task-log/log-v2.err /data/logs/analysis-adsshow-conversion-log/log.err /data/logs/sdk-task-log/adsshow.err
do
#第一次记录行号
if [[ $(grep -w "$logfile" $0.log|wc -l) == 1 ]];then
new_line_num=$(wc -l $logfile|awk '{print$1}')
old_line_num=$(grep -w "$logfile" $0.log|awk '{print$1}')
#新行号大于上一次的取到的行号就发告警 说明错误日志有增加
if [[ $new_line_num > $old_line_num ]];then
sed -i 's@'${old_line_num}' '${logfile}''@''${new_line_num}' '${logfile}'@' $0.log
wx "$(hostname)\n$logfile\n$(awk "NR>$old_line_num{print\$0}" $logfile|head -n 30)"
fi
#第一次记录行号
elif [[ $(grep -w "$logfile" $0.log|wc -l) == 0 ]]; then
echo $(wc -l $logfile) >> $0.log
fi
done
第二个需求是监控程序打印的日志,一段时间日志没有新增,程序有可能挂了,发企业微信告警。监控日志文件增长不需要关注内容,直接取日志文件的MD5值就好,没有改变就发企业微信告警。这边根据程序的输出定监控频率,生产是crontab 15分钟一次。
#bin/bash
#$0.log用于记录文件md5
cd /sh
if [[ ! -f $0.log ]];then
touch $0.log
fi
#发送企业微信告警
wx(){
cat > $0.msg << EOF
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "text",
"text": {
"content": "$1",
}
}'
EOF
sh $0.msg && rm -rf $0.msg
}
#in 后面是需要监控的日志文件 需用绝对路径
for i in /data/logs/analysis-track-log/returning-conversion-event.log /data/logs/analysis-adsshow-conversion-log/conversion-event.log /data/logs/sdk-task-log/adsshow.log
do
if grep -q "$i" $0.log;then
oldmd5=$(grep -w $i $0.log|awk '{print$2}')
newmd5=$(tail $i|md5sum|awk '{print$1}')
#比对MD5值不等说明日志增长停了,应用可能已经挂了
if [ "$oldmd5" == "$newmd5" ];then
wx "$(hostname) $i 日志10分钟没有增长"
else
sed -i 's@'${i}' '${oldmd5}''@''${i}' '${newmd5}'@' $0.log
fi
else
echo "$i $(tail $i|md5sum|awk '{print$1}')" >> $0.log
fi
done
监控效果


1530

被折叠的 条评论
为什么被折叠?



