1. 程式人生 > >當日志文件中的時間與主機時間不同步時,怎麼監控每隔五分鐘檢測一次日誌檔案是否出自按某個關鍵字?

當日志文件中的時間與主機時間不同步時,怎麼監控每隔五分鐘檢測一次日誌檔案是否出自按某個關鍵字?

今有需求:需要監控每隔五分鐘檢測一次日誌檔案是否出自按某個關鍵字。利用過濾全部的日誌資訊 雖然可以過濾出來關鍵字告警,但是修復後,依然還是會報警,存在侷限性,所以需要使用以下辦法來實現需求。

本想迴圈獲取5分鐘內的時間戳,然後從日誌檔案中grep這個時間端的資訊,然後再獲取關鍵字,但是通過檢視日誌檔案發現時間戳與主機時間不同步,所以,這種方法不可取。
那麼怎麼獲取最近五分鐘的日誌資訊,再過濾關鍵字呢?思索了很久,又有了新思路。
將現在的檔案日誌重定向到一個新的檔案裡面

cat /var/log/xxx >  /root/logs/tmp.txt9  //執行此命令,因為第一次需要手動執行,後續迴圈不需要再執行

然後寫一個監控指令碼(此指令碼是被監控主機監控項的命令,五分鐘獲取一次資訊,即五分鐘執行一次指令碼)

#!/bin/sh
LOG_FILE=/var/log/xxx
KEY_WORDS="guanjianzi"
if [ ! -s /var/log/xxx ];then //判斷檔案是否為空,為空則輸出為0;不為空,則執行下一步
echo "0"
else 
  A=$(awk '{print NR}' /root/logs/tmp.txt9 | tail -n1) //統計將日誌重定向的到此檔案的行數
  B=$(awk '{print NR}' /var/log/xxx | tail -n1) //統計日誌的行數(此時已經比重定向裡面的檔案多了五分鐘的資訊)

  C=$( echo $B - $A |bc)  //獲取日誌檔案最新五分鐘的行數
  tail -n $C /var/log/xxx> /root/logs/tet9  //檢視最近五分鐘的資訊並寫入一個新的檔案

  cat  /root/logs/tet9 | grep "$KEY_WORDS" >txt9 //在最近五分鐘的檔案中過濾某個關鍵字,將輸出結果寫入一個新的檔案
  if [ -s txt9 ]; then  //判斷這個檔案是否為空,不為空則輸出1 ;為空,則輸出為0
    echo "1"
  else
   echo "0"
 fi
fi
        cat /var/log/xxx  > /root/logs/tmp.txt9  //將此事的日誌資訊重定向到該檔案當中去

然後五分鐘後又會執行此指令碼,如此迴圈。