自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Shell腳本實戰(zhàn):日志關(guān)鍵字監(jiān)控+自動告警

系統(tǒng) Linux
主要用于Linux服務(wù)器監(jiān)控程序日志,如出現(xiàn)關(guān)鍵字異常則觸發(fā)相應(yīng)的動作或告警操作,通知到郵件聯(lián)系人。

該程序使用場景說明:主要用于Linux服務(wù)器監(jiān)控程序日志,如出現(xiàn)關(guān)鍵字異常則觸發(fā)相應(yīng)的動作或告警操作,通知到郵件聯(lián)系人。

一、安裝郵件服務(wù)

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解壓縮目錄放置同一路徑

執(zhí)行打補丁命令: 

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

進入mailx-12.4重新執(zhí)行編譯命令: 

  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、測試發(fā)送郵件

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

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

二、關(guān)鍵字監(jiān)控腳本開發(fā)

CheckLogs.sh 日志監(jiān)控程序

SendMail.sh 發(fā)郵件腳本,該腳本可自定義

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

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

后續(xù)運行腳本則讀取更新日志,例如當前日志更新了9行數(shù)據(jù),則腳本從最新的9行數(shù)據(jù)獲取關(guān)鍵字

測試插入關(guān)鍵字error

繼續(xù)執(zhí)行腳本可以看到已捕獲關(guān)鍵字并觸發(fā)告警

測試多關(guān)鍵字

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

測試頻率控制

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

  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. #創(chuàng)建各種目錄  
  9. mkdir -p $logsdir $tmpsdir $confdir  
  10. #創(chuàng)建配置文件  
  11. if test ! -e "$chkfile";then  
  12.     echo "#日志文件,關(guān)鍵字(多關(guān)鍵字|隔開),重試次數(shù),最大執(zhí)行次數(shù),啟動命令,停止命令" >$chkfile  
  13. fi  
  14. #生成日志函數(shù)  
  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 "應(yīng)用名稱為空,退出執(zhí)行"  
  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)不存在,退出執(zhí)行"  
  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),關(guān)鍵字為空,退出執(zhí)行"  
  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 "應(yīng)用($app_name),觸發(fā)動作腳本為空,退出執(zhí)行"  
  70.             exit 0  
  71.         fi  
  72.         if test -z "$mail_contacts";then  
  73.             do_writelog i "應(yīng)用($app_name),聯(lián)系人為空,退出執(zhí)行"  
  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),初始化讀取日志行數(shù):$log_new_count,退出執(zhí)行"  
  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),讀取歷史行數(shù)失敗,退出執(zhí)行"  
  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),未更新,退出執(zhí)行"  
  91.             exit 0  
  92.         elif [ $log_new_count -lt $log_old_count ];then  
  93.             do_writelog i "日志文件($log_filename),跨日更新日志行數(shù):$log_new_count,退出執(zhí)行"  
  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),歷史行數(shù):$log_old_count,最新行數(shù):$log_new_count,更新行數(shù):$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),未獲取到關(guān)鍵字,退出執(zhí)行"  
  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),日志內(nèi)容:$log_content,找到關(guān)鍵字:$i,停止命令:$stops_command,啟動命令:$start_command,重啟服務(wù)"  
  125.                    if [ $open_sendmail -eq 1 ];then  
  126.                        if test -n "$mail_scripts";then  
  127.                            $mail_scripts "應(yīng)用[$app_name]故障" "日志文件($log_filename),日志內(nèi)容:$log_content,找到關(guān)鍵字:$i" "$mail_contacts" 1>>$logfile 2>&1  
  128.                            if [ $? -ne 0 ];then  
  129.                                do_writelog i "日志文件($log_filename),日志內(nèi)容:$log_content,找到關(guān)鍵字:$i,觸發(fā)告警失敗"  
  130.                            fi  
  131.                            do_writelog i "日志文件($log_filename),日志內(nèi)容:$log_content,找到關(guān)鍵字:$i,觸發(fā)告警通知聯(lián)系人:[$mail_contacts]"  
  132.                        fi  
  133.                    else  
  134.                        do_writelog i "日志文件($log_filename),日志內(nèi)容:$log_content,找到關(guān)鍵字:$i,不觸發(fā)告警"  
  135.                    fi  
  136.                else  
  137.                    do_writelog i "日志文件($log_filename),日志內(nèi)容:$log_content,找到關(guān)鍵字:$i,重啟服務(wù)超出當天限制次數(shù):$log_max,退出執(zhí)行"  
  138.                fi  
  139.                rm -f $tmpsdir/${log_md5sum}.retry &>/dev/null  
  140.            else  
  141.                do_writelog i "日志文件($log_filename),日志內(nèi)容:$log_content,找到關(guān)鍵字:$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學(xué)習
相關(guān)推薦

2009-11-26 19:24:54

PHP類CMS

2009-08-21 14:58:56

C# this關(guān)鍵字

2013-01-30 10:12:14

Pythonyield

2018-04-20 15:56:09

Pythonglobal關(guān)鍵字

2009-09-02 09:24:03

C# this關(guān)鍵字

2009-09-17 09:30:00

Linq LET關(guān)鍵字

2012-03-01 12:50:03

Java

2022-01-04 16:35:42

C++Protected關(guān)鍵字

2009-08-06 17:52:23

C#增加that關(guān)鍵字

2019-12-20 15:19:41

Synchroinze線程安全

2024-03-15 15:12:27

關(guān)鍵字底層代碼

2009-08-13 17:44:34

C# using關(guān)鍵字

2009-08-21 14:47:59

C# base關(guān)鍵字

2009-12-17 13:57:15

Ruby關(guān)鍵字

2011-06-14 13:26:27

volatile

2021-08-06 07:51:47

關(guān)鍵字int函數(shù)

2022-01-10 18:11:42

C語言應(yīng)用技巧

2022-11-12 18:32:50

Golangomitemptyjson

2009-08-26 15:16:29

C# lock關(guān)鍵字

2019-11-06 10:36:43

MavenoptionalJava
點贊
收藏

51CTO技術(shù)棧公眾號