关于python+shell脚本实现nginx错误日志报警
**
1.shell脚本
**
这是采取awk的方式通过截取nginx日志的时间 来统计一分钟内错误日志有哪些或者有多少,并打印出来
```powershell
#!/bin/bash
#!/usr/bin/python
# -*- coding:utf-8 -*-
#日志文件路径
hostname=`hostname`
logfile=/var/log/nginx
#当天日期,年月日
cur_date=`date +"%Y/%m/%d"`
#开始时间(1分钟前),时分秒
start_time=`date -d"1 minutes ago" +"%H:%M:%S"`
#结束时间,时分秒
stop_time=`date +"%H:%M:%S"`
#把新增的错误日志写到new_error_log中
tac $logfile/error.log | awk -v st="$start_time" -v et="$stop_time" -v dt="$cur_date" '{t=$2;t1=$1; if(dt==t1 && t>=st && t<=et) {print $0}}' > $logfile/new_error_log.txt
#err_log=`tail -10 $logfile/new_error_log.txt`
#file_size=`du $logfile/new_error_log.txt | awk '{print $1}'`
hang=`awk '{print NR}' $logfile/new_error_log.txt|tail -n1`
if [[ $hang -lt 3 ]];then
err_log=`tail -3 $logfile/new_error_log.txt`
python /root/scripts/send_ding.py "$err_log"
else
err_log=`tail -1 $logfile/new_error_log.txt`
python /root/scripts/send_ding.py "$err_log
等$hang条错误"
fi
2.python小脚本
这个主要是结合钉钉来实现群机器人报警功能
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "https://oapi.dingtalk.com/robot/send?access_token=这里填入机器人的hook,就是全是数字那一串东西"
def msg(text,subject):
json_text= {
"actionCard": {
"title": subject,
"text": text,
"hideAvatar": "0",
"btnOrientation": "0",
"btns": [
{
"title": subject[:12],
"actionURL": ""
}
]
},
"msgtype": "actionCard"
}
print(requests.post(api_url,json.dumps(json_text),headers=headers).content)
if __name__== '__main__':
text = sys.argv[1]
text = text.replace("\n", "\n\n")
subject = sys.argv[1]
msg(text, subject)
3.加入到计划任务,一分钟执行一次
*/1 * * * * sh /root/scripts/alert_nginx_hang.sh
结语
总的来说,实现起来并没有特别大难度,其实可以用zabbix专门有功能监控nginx错误日志的,但是由于公司没用这么重量级的,所以就采取这种轻量化的脚本来实现