1

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

如果出现任何消​​息,我希望能够通过电子邮件发送这些新日志 - 例如间隔 15 分钟。我想CRON用来调用将发送新内容的 bash 脚本。

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

4

2 回答 2

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,因为日志文件可能已被轮换(如果适用),您必须将旧日志文件的尾部和新日志文件中的所有内容结合起来。

于 2013-04-30T11:47:49.183 回答
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
  • 将使用不存在的 url 向您的网站发出请求,其中包含您的字符串(因此,您会收到新的通知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"
于 2013-04-30T14:55:34.700 回答