有/var/log/httpd/error_log
文件,其中包含整個httpd
的錯誤。發送附帶最新文件內容的郵件
我希望能夠通過電子郵件發送這些新日誌(如果有) - 例如間隔15分鐘。我想用CRON
來調用將發送新內容的bash腳本。
是否有任何有效的方法來獲取,自上次檢查後追加了哪些行?
有/var/log/httpd/error_log
文件,其中包含整個httpd
的錯誤。發送附帶最新文件內容的郵件
我希望能夠通過電子郵件發送這些新日誌(如果有) - 例如間隔15分鐘。我想用CRON
來調用將發送新內容的bash腳本。
是否有任何有效的方法來獲取,自上次檢查後追加了哪些行?
當發送郵件,你可以存儲文件的行數的地方(例如,文件),然後用tail +n
只從第n行打印,就像
last_linecount=`cat .last_linecount` # or check if file does not exist
wc -l /var/log/httpd/error_log >.last_linecount
tail -n +$((last_linecount + 1)) /var/log/httpd/error_log | whatever
你還應檢查當前行數是否低於last_linecount
,因爲日誌文件可能已被輪換(如果適用),您必須將舊日誌文件中的尾部和新日誌文件中的所有內容組合起來。
您可以使用error_log
作爲標記,並且不需要在外部文件中存儲行號。
下一個腳本:
#!/bin/bash
STRING="last_log_check_point_string"
LOGFILE="/opt/local/apache2/logs/error_log"
URL="http://localhost/$STRING"
linenum=$(grep -n "$STRING" $LOGFILE | tail -1 | sed 's/:.*//')
curl "${URL}" >/dev/null 2>&1
[[ ! -z "$linenum" ]] && sed -n "$linenum,\$p" < $LOGFILE | mail -s "error log at $(date)" "[email protected]"
last_log_check_point_string
error_log
- 新的marker_point
)error_log的最後一行將是新的marker point
,因此您可以控制腳本的工作方式。如果您沒有curl
,請使用wget
- 或者也可以用純粹的bash發出請求。
或變種 - 你會得到電子郵件,只有當某些錯誤發生
#!/bin/bash
STRING="last_log_check_point_string"
LOGFILE="/opt/local/apache2/logs/error_log"
URL="http://localhost/$STRING"
TEMPFILE="/tmp/hterror.$$"
linenum=$(grep -n "$STRING" $LOGFILE | tail -1 | sed 's/:.*//')
curl "${URL}" >/dev/null 2>&1
[[ ! -z "$linenum" ]] && sed -n "$linenum,\$p" < $LOGFILE | grep -v "$STRING" >$TEMPFILE
[[ -s "$TEMPFILE" ]] && mail -s "error log at $(date)" "[email protected]" < $TEMPFILE
rm -f "$TEMPFILE"