今有需求:需要監控每隔五分鐘檢測一次日誌文件是否出自按某個關鍵字。利用過濾全部的日誌信息 雖然可以過濾出來關鍵字告警,但是修復後,依然還是會報警,存在侷限性,所以需要使用以下辦法來實現需求。
本想循環獲取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 //將此事的日誌信息重定向到該文件當中去
然後五分鐘後又會執行此腳本,如此循環。