服務錯誤日誌監控指令碼併發送DingDing通知模板
阿新 • • 發佈:2020-12-22
技術標籤: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的次數