如果附加,则发送包含最新文件内容的邮件

时间:2013-04-30 11:42:01

标签: bash file-processing logfile

/var/log/httpd/error_log个文件包含整个httpd的错误。

我希望能够通过电子邮件发送这些新日志(如果有的话) - 例如间隔15分钟。我想使用CRON来调用将发送新内容的bash脚本。

是否有任何有效的方法可以获得,自上次检查以来追加了哪些行?

2 个答案:

答案 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"