/var/log/httpd/error_log
个文件包含整个httpd
的错误。
我希望能够通过电子邮件发送这些新日志(如果有的话) - 例如间隔15分钟。我想使用CRON
来调用将发送新内容的bash脚本。
是否有任何有效的方法可以获得,自上次检查以来追加了哪些行?
答案 0 :(得分:2)
发送邮件时,您可以将文件的行数存储在某处(例如,文件),然后使用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
,因为日志文件可能已经旋转(如果适用),您必须将旧日志文件的尾部和来自新的日志文件。
答案 1 :(得分:2)
您可以使用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)" "your@email.com"
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)" "your@email.com" < $TEMPFILE
rm -f "$TEMPFILE"