有/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)" "your@email.com"
last_log_check_point_string
error_log
- 新的marker_point
)error_log 的最后一行将是 new 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"