хвост и grep лог и почта (linux) - PullRequest
9 голосов
/ 11 января 2011

Я хочу привязать лог-файл к grep и отправить его по почте, например:

tail -f /var/log/foo.log | grep error | mail -s subject name@example.com

Как я могу это сделать?

Ответы [ 3 ]

19 голосов
/ 11 января 2011

Вы хотите отправить электронное письмо при возникновении ошибок? Это может не сработать;)

Однако вы можете попробовать что-то вроде этого:

tail -f $log |
grep --line-buffered error |
while read line
do
    echo "$line" | mail -s subject "$email"
done

Который для каждой строки в выводе grep отправляет электронное письмо.

Запустите указанный выше сценарий оболочки с

nohup ./monitor.sh &

, поэтому он будет работать в фоновом режиме.

2 голосов
/ 11 января 2011

Я пойду на это.Возможно, я кое-что узнаю, если мой нехитрый bash-код будет тщательно проверенСуществует вероятность того, что для этого уже существует несколько миллиардов решений, но я не собираюсь это выяснять, поскольку уверен, что вы тралили глубины и ширины кибер-океана.Похоже, то, что вы хотите, можно разделить на два бита: 1) через равные промежутки времени получать «последний хвост» файла, 2) если последний хвост действительно существует, отправить его по электронной почте.Для регулярных интервалов в 1) используйте cron.Для получения последней версии 2) вам нужно будет следить за размером файла.Сценарий bash ниже делает это - решение 2), которое может быть вызвано cron.Он использует размер кэшированного файла для вычисления фрагмента файла, который ему нужен для отправки по почте.Обратите внимание, что для файла myfile создается другой файл .offset.myfile.Также скрипт не допускает пути компонентов в имени файла.Перепишите или исправьте его в вызове [например (cd / foo / bar && segtail.sh zut), предполагая, что он называется segtail.sh].

#!/usr/local/bin/bash
file=$1
size=0
offset=0
if [[ $file =~ / ]]; then
   echo "$0 does not accept path components in the file name" 2>&1
   exit 1
fi
if [[ -e .offset.$file ]]; then
   offset=$(<".offset.$file")
   fi
if [[ -e $file ]]; then
   size=$(stat -c "%s" "$file")    # this assumes GNU stat, possibly present as gstat. CHECK!
                                   # (gstat can also be Ganglias Status tool - careful).
fi
if (( $size < $offset )); then     # file might have been reduced in size
   echo "reset offset to zero" 2>&1
   offset=0
fi
echo $size > ".offset.$file"
if [[ -e $file &&  $size -gt $offset ]]; then
   tail -c +$(($offset+1)) "$file" | head -c $(($size - $offset)) | mail -s "tail $file" foo@bar
fi
0 голосов
/ 25 января 2019

Как насчет:

mail -s "catalina.out errors" blah@myaddress.com

...