Назад | Перейти на главную страницу

как «пакетировать» вывод «tail -F» или выводить все данные в потоке каждые X секунд?

Я пытаюсь отслеживать файл журнала в режиме реального времени. Скажем, я выдаю такую ​​команду, как:

tail -F mysystem.log | grep -i error | mail ...

Предполагается, что это отслеживает мой файл журнала, каждый раз, когда он видит ошибку, отправляйте по электронной почте строку, содержащую ошибку.

Однако возможно, что что-то взорвется, и я получаю сотни ошибок в секунду. Я не хочу также убивать свой почтовый сервер, отправляя сотни писем в секунду. Поэтому мне нужен какой-то оператор задержки:

tail -F mysystem.log | grep -i error | window X | mail ...

Это будет удерживать все мои сообщения об ошибках в течение X секунд, а затем отпустить их вместе. Таким образом, я буду получать электронное письмо не чаще, чем каждые X секунд.

В качестве бонуса я бы хотел иметь возможность делать следующее:

tail -F mysystem.log | grep -i error | window X Y | mail ...

То же, что и предыдущая команда, но если количество строк в окне больше, чем Y, то отправьте электронное письмо, содержащее Y сообщений (окно очищается и сбрасывается).

Как я могу сделать это без написания программы на PERL? Я хотел бы придерживаться того, что уже встроено в UNIX.

Это прекрасно решается с помощью rsyslog и ommail (и модуля omfile, если ваш журнал несовместим с syslog). У меня есть несколько устройств от разных поставщиков в защищенном центре обработки данных, все они отправляют свои события системного журнала на мой центральный сервер rsyslog. Используя модуль ommail, я настраиваю оповещения по электронной почте при различных условиях; встроенный порог интервала гарантирует, что меня не засыпают сообщениями (я настроил его на отправку не более одного предупреждения для каждого типа каждые 60 минут).

Работает хорошо, легко настраивается: просто убедитесь, что у вас установлена ​​последняя версия rsyslog; Ubuntu 10.04.2LTS по-прежнему поставляется с версией 4.2, выпущенной почти два года назад, в которой отсутствуют некоторые исправления ошибок.

Я думаю, вы можете сделать это с помощью именованных каналов.

Сначала создайте канал и процесс рассылки:

mkfifo logwatch_fifo
while true; do cat logwatch_fifo | mail ...; sleep 10; done

Затем проведите мониторинг и напишите в фифо:

tail -F mysystem.log | grep -i error > logwatch_fifo

Вы можете настроить его по своему вкусу, в основном делая все, что хотите, с выводом, буферизированным в FIFO, используя некоторые варианты цикла while и сна.

Здесь вам нужен именованный канал вместо обычного канала (просто направьте вывод в (while true ...) subhell, например), потому что, если вы сделаете последнее, кошка никогда не отпустит трубку, если хвост не закрывает ее конец.

Вы можете попробовать «Тенши». Написано на PERL :), может отслеживать несколько файлов журналов и запускаться reg-exp.

Пакет Debian, Пакет Ubuntu, Gentoo ebuild