监控服务(新增)错误日志脚本并发送DingDing|邮件通知模板

1.监控模板

该模板支持
(1)DingDing告警与邮件告警
(2)自定义监控日志的黑名单与白名单关键字配置
vim log_monitor_template.sh

#!/bin/bash

# sh log_monitor_template.sh $1 $2 $3 $4 $5 $6 $7 $8
#----------------------------------------------------------------------
#FileName:      exec.sh
#Version:       1.4
#Date:          2021-01-20
#Author:        黄土高坡上的独孤前辈
#Description: 
#    此脚本传入8个参数,分别是
#    root_dir:需要遍历的日志根目录或直接传入需要监控的单个日志文件         
#    MySQL_userName: 账号  
#    MySQL_password: 密码
#    MySQL_hostname:  host
#    MySQL_tableName:  库名.表名
#    DingDingWebhook_or_EmailUser: 钉钉webhook或邮件通知人(多个用逗号隔开,如XXXXXXXXX@qq.com,XXXXXXXXX@qq.com)
# 								   (如何配置DingDing和linux自带邮件系统,自行安装)
#    noticeTitle: DingDing或邮件 通知标题
#    Alarm_type: 1(DingDing告警) or 2(邮件告警)
#Notes:
#       2016-12-21 脚本封装   
#       2017-01-25 由原来仅监控目录至可监控目录与文件
#       2020-08-31 在DINGDING告警的基础上,新增邮件告警 
#       2021-01-20 新增监控日志黑名单与白名单(需在模板中配置)
#----------------------------------------------------------------------


# 如果脚本中出现变量没定义情况,则停止运行
set -u 

USAGE="Usage : $0 need eight parameter 
for example:
log_monitor_template.sh \
1 \ #需要遍历的日志根目录或直接传入需要监控的单个日志文件
2 \ # Mysql 账号             
3 \ # Mysql 密码
4 \ # Mysql host
5 \ # Mysql 库名.表名
6 \ # DingDingWebhook or EmailUser
7 \ # DingDing或邮件 通知标题
8   # 1(DingDing告警) or 2(邮件告警)
"

[ $# -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"  
DingDingWebhook_or_EmailUser="$6" 
noticeTitle="$7" 
Alarm_type="$8" 
# 初始化监控文件,通过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 $DingDingWebhook_or_EmailUser -H 'Content-Type: application/json' -d "
    {
        'msgtype': 'text',
        'text': {
            'content': '$noticeTitle\n
HOST: [$hostname]\n
ERROR_LOG_DIR: [$monitor_file] \n
ERROR_INCREASE_TIMES: [$error_increase]\n
CREATE_TIME: [$now]'
        }
    }"
}

# 邮件告警(其他格式请自行配置)
function Email_Alarm(){

email_title="$noticeTitle"
email_context="
HOST: [$hostname]
ERROR_LOG_DIR: [$monitor_file] 
ERROR_INCREASE_TIMES: [$error_increase]
CREATE_TIME: [$now]"
email_user=$DingDingWebhook_or_EmailUser

echo -e "$email_context" | mail -s "$email_title" $email_user

}

# 错误日志监控
function error_monitor(){

#监控黑名单(监控日志中包含 ERROR或WARN,如果想监控其他特殊字符,可自定义.注意此处关键字区分大小写)
keywords_blackList='ERROR'
#监控白名单(不监控日志中包含rollback或version conflict的错误)
keywords_whiteList='rollback|version conflict'
#是否开启白名单(默认关闭)
boolean_whiteList=false

if $boolean_whiteList ;then
   error_times=$(cat $monitor_file | grep -vE "$keywords_whiteList" | grep -E "$keywords_blackList" | wc -l)
   echo 'error_times' $error_times
else
   error_times=$(cat $monitor_file | grep -E "$keywords_blackList" | wc -l)
   echo 'error_times' $error_times
fi
 
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');
		 "
		 
		 if [[ $Alarm_type -eq 1 ]];then
			# 钉钉告警
			DingDing_Alarm
		 elif [[ $Alarm_type -eq 2 ]];then
			# 邮件告警
			Email_Alarm
		 fi 		

	   elif [[ $error_increase -lt 0 ]];then
	     echo 'error_increse 小于0'
		  # 对于canal日志目录监控,每天会创建新的adapter.log文件,存在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 

}


# root_dir如果是目录则遍历目录下的所有子目录及文件,root_dir也可以是单个日志文件
function getdir(){
	if [ -d $root_dir ]
	then 
		# 如果传入目录
		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
	else
		# 如果传入日志文件
		monitor_file=$root_dir
		#对传入日志文件进行监控
		error_monitor
	fi	
}

# 初始化数据库(一般只用初始化一次)
error_storage && \
# 执行脚本
getdir

2.使用脚本

(1) 监控目录
以监控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 通知标题 
"1" # 发送DingDing通知

(2)监控单个日志文件
监控canal adapter的日志log,由于canal会将每天的日志文件放入文件夹,并以gzip格式存储,如果监控/canal-adapter/logs/adapter目录,则会有问题,故直接监控/canal-adapter/logs/adapter/adapter.log文件

[root@XX adapter]# pwd
/canal-adapter/logs/adapter
[root@XX adapter]# ls
2020-12-21  adapter.log

vim es_log_monitor.sh

 #!/bin/bash
/usr/local/canal-adapter-es6/monitor/log_monitor_template.sh \
"/canal-adapter-es6/logs/adapter/adapter.log" \
"XX" \
"XX" \
"XX" \
"XX" \
"XX" \
"ES Log Error Alarm" \
"1" # 发送DingDing通知

使用crontab 每5个小时监控一次新增错误,注意使用crontab调度在脚本中只能够使用绝对路径,如果es_log_monitor.sh使用相对路径./log_monitor_template.sh…,则crontab会执行不了

00 */5 * * * /monitor/es_log_monitor.sh

(3)监控单个文件发送邮件通知

/usr/local/canal-adapter-phoenix-noPool/monitor/log_monitor_template.sh \
"XXX/adapter.log" \
"XXX" \
"XXX" \
"XXX" \
"XXX.PHOENIX_LOG_MONITOR" \
"XXX@qq.com,XXX@qq.com" \
"Phoenix Log Error Alarm" \
"2"  # 发送邮件通知

3.效果

Mysql表中存储
在这里插入图片描述

DingDing通知
在这里插入图片描述
邮件通知
在这里插入图片描述

注意:此脚本只监控日志中 新增ERROR的次数

4.如何安装DingDing和邮件服务器

参考我另外两篇博客
如何安装DingDing告警

https://blog.csdn.net/lihuazaizheli/article/details/107188481

如何安装邮件告警

https://blog.csdn.net/lihuazaizheli/article/details/107519691

5.拓展

此处是通过MySQL作为存储,而知道错误日志是否新增。另外,还可以通过比较ERROR日志文件的MD5值是否相同而判断是否有新增错误日志,可自行研究。可参考如下连接:

 https://blog.csdn.net/weixin_33813128/article/details/92258523
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值