成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Shell腳本實戰:日志關鍵字監控+自動告警

系統 Linux
主要用于Linux服務器監控程序日志,如出現關鍵字異常則觸發相應的動作或告警操作,通知到郵件聯系人。

該程序使用場景說明:主要用于Linux服務器監控程序日志,如出現關鍵字異常則觸發相應的動作或告警操作,通知到郵件聯系人。

一、安裝郵件服務

1、解壓 

  1. tar -jxf mailx-12.4.tar.bz2 -C /usr/src/ && cd /usr/src/mailx-12.4/ 

2、編譯 

  1. make install UCBINSTALL=/usr/bin/install 

異常編譯報錯-1

異常報錯解決方法

下載mailx補丁文件“mailx-12.4-openssl_1.0.0_build_fix-1.patch”,將補丁文件和mailx解壓縮目錄放置同一路徑

執行打補丁命令: 

  1. patch -p0 < mailx-12.4-openssl_1.0.0_build_fix-1.patch 

進入mailx-12.4重新執行編譯命令: 

  1. make install UCBINSTALL=/usr/bin/install 

檢測mailx是否安裝成功:mailx -V

3、配置 

vi /etc/nail.rc,在文件的最后添加

set from=

set smtp=

set smtp-auth-user=

set smtp-auth-password=

set smtp-auth=login

如下圖所示,修改配置完后保存

4、測試發送郵件

echo '郵件正文'|mailx -v -s "郵件標題" 郵箱地址

至此郵件功能測試正常,接下來是關鍵字監控腳本的編寫工作,通過日志關鍵字腳本觸發郵件告警腳本實現日志監控

二、關鍵字監控腳本開發

CheckLogs.sh 日志監控程序

SendMail.sh 發郵件腳本,該腳本可自定義

conf 配置文件目錄,chklist為配置文件

初次執行CheckLogs.sh腳本會讀取日志文件并記錄當前讀取的行數

后續運行腳本則讀取更新日志,例如當前日志更新了9行數據,則腳本從最新的9行數據獲取關鍵字

測試插入關鍵字error

繼續執行腳本可以看到已捕獲關鍵字并觸發告警

測試多關鍵字

再次執行可以看到已捕獲最新更新的日志信息

測試頻率控制

至此相關功能測試已完成。最后附上腳本相關代碼如下: 

  1. #!/bin/bash  
  2. basedir=$(cd `dirname "$0"`;pwd)  
  3. logsdir=$basedir/logs  
  4. tmpsdir=$basedir/tmps  
  5. confdir=$basedir/conf  
  6. chkfile=$confdir/chklist  
  7. logfile=$logsdir/log.log_$(date +%F)  
  8. #創建各種目錄  
  9. mkdir -p $logsdir $tmpsdir $confdir  
  10. #創建配置文件  
  11. if test ! -e "$chkfile";then  
  12.     echo "#日志文件,關鍵字(多關鍵字|隔開),重試次數,最大執行次數,啟動命令,停止命令" >$chkfile  
  13. fi  
  14. #生成日志函數  
  15. do_writelog() {  
  16.     case $1 in  
  17.     i|I)  
  18.         shift  
  19.         echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)|INFO|$@" >>$logfile  
  20.         ;;  
  21.     e|E)  
  22.         shift  
  23.         echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)|ERROR|$@" >>$logfile  
  24.         ;;  
  25.     w|W)  
  26.         shift  
  27.         echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)|WARNING|$@" >>$logfile  
  28.         ;;  
  29.     *)  
  30.         echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)|DEBUG|$@" >>$logfile  
  31.         esac  
  32.  
  33. #日志處理部分代碼  
  34. cat $chkfile|egrep -v "^($|#)"|while read i;do  
  35.  
  36.     app_name=$(echo "$i"|awk -F, '{print $1}')  
  37.     if test -z "$app_name";then  
  38.         do_writelog e "應用名稱為空,退出執行"  
  39.         exit 0  
  40.     fi  
  41.     log_filename=$(echo "$i"|awk -F, '{print $2}')  
  42.     if test ! -e "$log_filename";then  
  43.         do_writelog e "日志文件($log_filename)不存在,退出執行"  
  44.         exit 0  
  45.     fi  
  46.     log_md5sum=$(echo -n "$log_filename"|md5sum|awk '{print $1}')  
  47.     log_gjz=$(echo "$i"|awk -F, '{print $3}')  
  48.     if test -z "$log_gjz";then  
  49.         do_writelog i "日志文件($log_filename),關鍵字為空,退出執行"  
  50.         exit 0  
  51.     fi  
  52.     log_retry=$(echo "$i"|awk -F, '{print $4}')  
  53.     expr $log_retry + 0 &>/dev/null  
  54.     if [ $? -ne 0 ];then  
  55.         log_retry=0  
  56.     fi 
  57.      log_max=$(echo "$i"|awk -F, '{print $5}')  
  58.     expr $log_max + 0 &>/dev/null  
  59.     if [ $? -ne 0 ];then  
  60.         log_max=3  
  61.     fi  
  62.     start_command=$(echo "$i"|awk -F, '{print $6}')  
  63.     stops_command=$(echo "$i"|awk -F, '{print $7}')  
  64.     open_sendmail=$(echo "$i"|awk -F, '{print $8}')  
  65.     mail_scripts=$(echo "$i"|awk -F, '{print $9}')  
  66.     mail_contacts=$(echo "$i"|awk -F, '{print $10}')  
  67.     if [ $open_sendmail -eq 1 ];then  
  68.         if test -z "$mail_scripts";then  
  69.             do_writelog i "應用($app_name),觸發動作腳本為空,退出執行"  
  70.             exit 0  
  71.         fi  
  72.         if test -z "$mail_contacts";then  
  73.             do_writelog i "應用($app_name),聯系人為空,退出執行"  
  74.             exit 0  
  75.         fi  
  76.     fi  
  77.     if test ! -e "$tmpsdir/$log_md5sum";then  
  78.         log_new_count=$(wc -l $log_filename|awk '{print $1}')  
  79.         echo "$log_new_count" >$tmpsdir/$log_md5sum 
  80.         do_writelog i "日志文件($log_filename),初始化讀取日志行數:$log_new_count,退出執行"  
  81.     else  
  82.         log_old_count=$(cat $tmpsdir/$log_md5sum)  
  83.         expr $log_old_count + 0 &>/dev/null 
  84.          if [ $? -ne 0 ];then  
  85.             do_writelog e "日志文件($log_filename),讀取歷史行數失敗,退出執行"  
  86.             exit 0  
  87.         fi  
  88.         log_new_count=$(wc -l $log_filename|awk '{print $1}')  
  89.         if [ $log_new_count -eq $log_old_count ];then  
  90.             do_writelog i "日志文件($log_filename),未更新,退出執行"  
  91.             exit 0  
  92.         elif [ $log_new_count -lt $log_old_count ];then  
  93.             do_writelog i "日志文件($log_filename),跨日更新日志行數:$log_new_count,退出執行"  
  94.             echo "$log_new_count" >$tmpsdir/$log_md5sum  
  95.         else  
  96.            log_upd_count=$(expr $log_new_count - $log_old_count)  
  97.            do_writelog i "日志文件($log_filename),歷史行數:$log_old_count,最新行數:$log_new_count,更新行數:$log_upd_count"   
  98.            #讀取更新的日志  
  99.            log_content=$(tail -n +`expr $log_old_count + 1` $log_filename|head -n +$log_upd_count)  
  100.            oldIFS=$IFS  
  101.            IFS="|"  
  102.            count=0  
  103.            for i in $log_gjz;do  
  104.                if [ $(echo "$log_content"|grep -c -w "$i") -ge 1 ];then  
  105.                    let count+=1    
  106.                fi  
  107.                if [ $count -gt 0 ];then  
  108.                    break  
  109.                fi  
  110.            done  
  111.            IFS=$oldIFS  
  112.            if [ $count -gt 0 ];then  
  113.                echo "0" >>$tmpsdir/${log_md5sum}.retry  
  114.            else  
  115.               do_writelog i "日志文件($log_filename),未獲取到關鍵字,退出執行"  
  116.               echo "$log_new_count" >$tmpsdir/$log_md5sum  
  117.               exit 0  
  118.            fi  
  119.            if [[ $(wc -l $tmpsdir/${log_md5sum}.retry|awk '{print $1}') -gt $log_retry ]];then  
  120.                echo "0" >>$tmpsdir/${log_md5sum}_$(date +%F)  
  121.                if [ $(wc -l $tmpsdir/${log_md5sum}_$(date +%F)|awk '{print $1}') -le $log_max ];then  
  122.                    $stops_command 1>>$logfile 2>&1  
  123.                    $start_command 1>>$logfile 2>&1  
  124.                    do_writelog i "日志文件($log_filename),日志內容:$log_content,找到關鍵字:$i,停止命令:$stops_command,啟動命令:$start_command,重啟服務"  
  125.                    if [ $open_sendmail -eq 1 ];then  
  126.                        if test -n "$mail_scripts";then  
  127.                            $mail_scripts "應用[$app_name]故障" "日志文件($log_filename),日志內容:$log_content,找到關鍵字:$i" "$mail_contacts" 1>>$logfile 2>&1  
  128.                            if [ $? -ne 0 ];then  
  129.                                do_writelog i "日志文件($log_filename),日志內容:$log_content,找到關鍵字:$i,觸發告警失敗"  
  130.                            fi  
  131.                            do_writelog i "日志文件($log_filename),日志內容:$log_content,找到關鍵字:$i,觸發告警通知聯系人:[$mail_contacts]"  
  132.                        fi  
  133.                    else  
  134.                        do_writelog i "日志文件($log_filename),日志內容:$log_content,找到關鍵字:$i,不觸發告警"  
  135.                    fi  
  136.                else  
  137.                    do_writelog i "日志文件($log_filename),日志內容:$log_content,找到關鍵字:$i,重啟服務超出當天限制次數:$log_max,退出執行"  
  138.                fi  
  139.                rm -f $tmpsdir/${log_md5sum}.retry &>/dev/null  
  140.            else  
  141.                do_writelog i "日志文件($log_filename),日志內容:$log_content,找到關鍵字:$i,重試檢測:$(wc -l $tmpsdir/${log_md5sum}.retry|awk '{print $1}')"  
  142.            fi  
  143.            echo "$log_new_count" >$tmpsdir/$log_md5sum  
  144.            do_writelog i "日志文件($log_filename),更新記次文件完成"   
  145.         fi  
  146.     fi  
  147. )&  
  148. done 

 

 

責任編輯:龐桂玉 來源: Linux學習
相關推薦

2009-11-26 19:24:54

PHP類CMS

2025-05-08 09:05:00

Shell腳本磁盤日志

2009-08-21 14:58:56

C# this關鍵字

2013-01-30 10:12:14

Pythonyield

2018-04-20 15:56:09

Pythonglobal關鍵字

2009-09-17 09:30:00

Linq LET關鍵字

2022-01-04 16:35:42

C++Protected關鍵字

2012-03-01 12:50:03

Java

2009-09-02 09:24:03

C# this關鍵字

2019-12-20 15:19:41

Synchroinze線程安全

2009-08-06 17:52:23

C#增加that關鍵字

2009-08-13 17:44:34

C# using關鍵字

2024-03-15 15:12:27

關鍵字底層代碼

2011-06-14 13:26:27

volatile

2009-08-21 14:47:59

C# base關鍵字

2021-08-06 07:51:47

關鍵字int函數

2022-01-10 18:11:42

C語言應用技巧

2009-08-26 15:16:29

C# lock關鍵字

2022-11-12 18:32:50

Golangomitemptyjson

2009-12-17 13:57:15

Ruby關鍵字
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品欧美一区二区精品久久久 | 欧美伊人久久久久久久久影院 | 精品一区二区三区四区五区 | 日本一区视频在线观看 | 一区二区三区精品 | 久色视频在线观看 | 国产精品美女久久久久aⅴ国产馆 | 国产精品美女一区二区三区 | 一级黄色大片 | 久久国产精品一区二区 | 国产精品毛片无码 | 成人片免费看 | 国产免费一区二区三区网站免费 | 日韩一区二区在线视频 | 四虎av电影 | 日韩视频在线播放 | 久久高清 | 久久精品亚洲国产 | 成人影院一区二区三区 | 国产精品乱码一二三区的特点 | 国产精品欧美一区二区 | 欧美日韩国产在线观看 | 久久精品国产99国产 | 99在线观看视频 | 国产精品一区二区三区四区 | 日韩在线欧美 | 亚洲精品视频在线播放 | 久久久观看 | 日本三级视频 | 免费毛片网 | 精品国产一级 | 国产日韩精品在线 | 麻豆91精品91久久久 | 色综合天天网 | 日本人爽p大片免费看 | 国产欧美日韩一区二区三区在线观看 | 男女羞羞视频在线 | 久久精品国产一区二区三区不卡 | 欧美性大战xxxxx久久久 | 亚洲成人精品一区 | 国产高清在线视频 |