當日志文件中的時間與主機時間不同步時,怎麼監控每隔五分鐘檢測一次日誌檔案是否出自按某個關鍵字?
阿新 • • 發佈:2018-12-28
今有需求:需要監控每隔五分鐘檢測一次日誌檔案是否出自按某個關鍵字。利用過濾全部的日誌資訊 雖然可以過濾出來關鍵字告警,但是修復後,依然還是會報警,存在侷限性,所以需要使用以下辦法來實現需求。
本想迴圈獲取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 //將此事的日誌資訊重定向到該檔案當中去
然後五分鐘後又會執行此指令碼,如此迴圈。