2013-04-30 1 views
1

Файл содержит /var/log/httpd/error_log файл содержит ошибки из целого httpd.Присылайте письмо с последним содержимым файла, если добавлено

Я хочу, чтобы иметь возможность отправлять эти новые журналы по электронной почте, если они появляются - например, с интервалом в 15 минут. Я хотел бы использовать CRON для вызова сценария bash, который отправит новое содержимое.

Есть ли способ получения прибыли, какие строки были добавлены после последней проверки?

ответ

2

При отправке почты, вы можете сохранить количество строк файла где-то (например, файл), а затем использовать tail +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 

You следует также проверить, не текущее ли количество строк ниже last_linecount, так как тогда файл журнала мог быть повернут (если применимо), и вам нужно объединить как хвост старого файла журнала, так и все из нового файла журнала.

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)" "[email protected]" 
  • найдет номер строки последнего совпадение last_log_check_point_string
  • сделает запрос на ваш веб с несуществующей URL, что содержать вашу строку (так, вы получаете новое уведомление в error_log - новый marker_point)
  • каждая строка после вышеуказанного номер строки отправит вам письмо.

Последняя строка error_log будет новой marker point, поэтому у вас есть контроль над тем, как работает скрипт. Если у вас нет curl, используйте wget - или можно сделать запрос с чистым башем.

или вариант - вы получите по электронной почте только тогда, когда некоторые ошибки произошли

#!/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" 
Смежные вопросы