1. 程式人生 > 其它 >服務錯誤日誌監控指令碼併發送DingDing通知模板

服務錯誤日誌監控指令碼併發送DingDing通知模板

技術標籤:Linux

文章目錄

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的次數