说明:
1、nginx 默认的error_log 格式
2、centos7 系统
3、通过设置 /etc/mail.rc 来发报警邮件,设置示例
-
# Set smtp server of alert
-
set bsdcompat
-
set from=opsbot@example.com
-
set smtp=smtp.example.com
-
set smtp-auth-user=opsbot@example.com
-
set smtp-auth-password="password"
-
set smtp-auth=login
以上可根据实际情况替换邮箱和密码
4、代码
-
#!/bin/sh
-
## configuration
-
## nginx error_log
-
error_log=/var/log/nginx/error.log
-
temp_file=/tmp/nginx.temp
-
reciever="user@example.com user2@example.com"
-
check_everything() {
-
if [ ! -f "$error_log" ] ; then
-
echo "error_log not exist." && exit
-
fi
-
if [ ! -f "$temp_file" ] ; then
-
touch $temp_file
-
fi
-
if [ ! -n "$reciever" ] ; then
-
echo "reviever not exist, please set." && exit
-
fi
-
}
-
## if $1 not exist,default minutes is from 00:00 to now
-
get_minutes() {
-
cur_time=`date +%H:%M:%S`
-
if [ $1 ] ; then
-
minute=$1
-
if [ "$minute" -le "9999" -a "$minute" -ge "1" ] ; then
-
ago_time=`date -d "$minute minutes ago" +%H:%M:%S`
-
fi
-
else
-
hour_minutes=$(expr `date +%H` \* 60)
-
minutes=$(expr $hour_minutes + `date +%M`)
-
ago_time=`date -d "$minutes minutes ago" +%H:%M:%S`
-
fi
-
}
-
get_error_upstream() {
-
-
awk '{if(($2>=start_time)&&($2<=end_time)) print $0}' start_time=$ago_time end_time=$cur_time $error_log | \
-
grep error | \
-
awk -F, '{print $5}'| \
-
awk -F':|/' '{if($1 ~ /upstream/)printf "%s:%s %s\n",$5,$6,$7}' |\
-
awk 'BEGIN{print "host:port service_name error_count"}{host_port[$1]=$1;service[$1]=$2;cnt[$1]+=1} \
-
END{for(i in host_port) print host_port[i],service[i],cnt[i]}' >$temp_file
-
}
-
-
send_notification() {
-
line=`wc -l $temp_file |awk '{print $1}'`
-
if [ $line -gt 1 ] ; then
-
cat $temp_file |mail -s "Some Service Maybe down,Please check now!" $reciever
-
fi
-
}
-
check_everything && \
-
get_minutes $@ && \
-
get_error_upstream &&\
-
send_notification &&\
-
cat $temp_file
阅读(2657) | 评论(0) | 转发(0) |