服务错误日志监控脚本并发送DingDing通知模板
程序员文章站
2022-06-24 20:34:39
...
1.监控模板
vim log_monitor_template.sh
#!/bin/bash
# sh log_monitor_template.sh $1 $2 $3 $4 $5 $6 $7
#----------------------------------------------------------------------
#FileName: exec.sh
#Version: 1.0
#Date: 2016-12-21
#Author: 黄土高坡上的独孤前辈
#Description:
# 此脚本传入7个参数,分别是
# root_dir:需要遍历的日志根目录
# MySQL_userName: 账号
# MySQL_password: 密码
# MySQL_hostname: host
# MySQL_tableName: 库名.表名
# DingDing_webhook: 钉钉 webhook
# DingDing_noticeTitle: 通知标题
#
#Notes:
# 2016-12-21 脚本封装
#----------------------------------------------------------------------
# 如果脚本中出现变量没定义情况,则停止运行
set -u
USAGE="Usage : $0 need seven parameter
for example:
log_monitor_template.sh \
1 \ #需要遍历的日志根目录
2 \ # Mysql 账号
3 \ # Mysql 密码
4 \ # Mysql host
5 \ # Mysql 库名.表名
6 \ # DingDing webhook
7 # DingDing 通知标题
"
[ $# -eq 0 ] && echo "$USAGE" && exit 1
now=`date '+%Y-%m-%d %H:%M:%S'`
# 传入要遍历的目录
root_dir="$1"
MySQL_userName="$2"
MySQL_password="$3"
MySQL_hostname="$4"
MySQL_tableName="$5"
DingDing_webhook="$6"
DingDing_noticeTitle="$7"
# 初始化监控文件,通过getdir方法得到
monitor_file=
# 错误记录到mysql(此表是通用结构,可根据实际情况自定义)
function error_storage(){
/usr/bin/mysql -u$MySQL_userName -p$MySQL_password -h $MySQL_hostname -P 3306 -e \
"use hadoop;
CREATE TABLE IF NOT EXISTS $MySQL_tableName(
HOST_NAME VARCHAR(255) COMMENT '日志产生的HOST',
ERROR_LOG_DIR VARCHAR(255) COMMENT 'ERROR日志目录',
ERROR_TIMES INT(11) DEFAULT 0 COMMENT '日志中新增ERROR次数',
CREATE_TIME DATETIME DEFAULT NULL COMMENT '日志时间',
PRIMARY KEY (HOST_NAME,ERROR_LOG_DIR)
)ENGINE = INNODB DEFAULT CHARSET = utf8 comment 'APPLICATION 的日志监控';
"
}
# 钉钉告警
function DingDing_Alarm(){
curl $DingDing_webhook -H 'Content-Type: application/json' -d "
{
'msgtype': 'text',
'text': {
'content': '$DingDing_noticeTitle\n
HOST: [$hostname]\n
ERROR_LOG_DIR: [$monitor_file] \n
ERROR_TIMES: [$error_increase]\n
CREATE_TIME: [$now]'
}
}"
}
# 错误日志监控
function error_monitor(){
#监控日志中包含 ERROR或WARN,如果想监控其他特殊字符,可自定义
error_times=$(cat $monitor_file | grep -E 'ERROR|WARN' | wc -l)
echo 'error_times' $error_times
if [[ $error_times -gt 0 ]];then
hostname=$HOSTNAME
# 查询mysql中存储的error_times
error_times_mysql=`/usr/bin/mysql -u$MySQL_userName -p$MySQL_password -h $MySQL_hostname -P 3306 -Bse "
select ERROR_TIMES from $MySQL_tableName WHERE HOST_NAME='"$hostname"' AND ERROR_LOG_DIR='"$monitor_file"';
" | tr -cd '[0-9]' | sed -r 's/0*([0-9])/\1/'`
# error_times_mysql为空时,赋值为0
para=
if [[ $error_times_mysql == $para ]];then
error_times_mysql=0
fi
# 新增error次数
error_increase=$(($error_times - $error_times_mysql))
echo 'hostname' $hostname
echo 'monitor_file' $monitor_file
echo 'error_times_mysql' $error_times_mysql
echo 'error_increase' $error_increase
if [[ $error_increase -gt 0 ]];then
echo 'error_increse 大于0'
# 错误日志情况
/usr/bin/mysql -u$MySQL_userName -p$MySQL_password -h $MySQL_hostname -P 3306 -e \
"
replace into $MySQL_tableName(HOST_NAME,ERROR_LOG_DIR,ERROR_TIMES,CREATE_TIME) values('"$hostname"','"$monitor_file"','"$error_times"','$now');
"
# 钉钉告警
DingDing_Alarm
elif [[ $error_increase -lt 0 ]];then
echo 'error_increse 小于0'
/usr/bin/mysql -u$MySQL_userName -p$MySQL_password -h $MySQL_hostname -P 3306 -e \
"
delete from $MySQL_tableName WHERE HOST_NAME='"$hostname" AND ERROR_LOG_DIR='"$monitor_file"'';
"
fi
fi
}
# 遍历目录下的所有子目录及文件
function getdir(){
for element in `ls $root_dir`
do
dir_or_file=$root_dir"/"$element
if [ -d $dir_or_file ]
then
getdir $dir_or_file
else
monitor_file=$dir_or_file
# echo $monitor_file
#对每个文件日志进行监控
error_monitor
fi
done
}
# 初始化数据库(一般只用初始化一次)
error_storage && \
# 执行脚本
getdir
2.使用脚本
以监控flume的log为例
vim flume_log_monitor.sh
./log_monitor_template.sh \
"/flume/logs" \ #需要遍历的日志根目录
"XXX" \ # Mysql 账号
"XXX" \ # Mysql 密码
"XXX" \ # Mysql host
"XXX" \ # Mysql 库名.表名
"XXX" \ # DingDing webhook
"FLUME Log Error Alarm" #DingDing 通知标题
3.效果
Mysql表中存储
DingDing通知
注意:此脚本只监控日志中 新增ERROR的次数
上一篇: jira 终止任务