Grep в новых файлах журнала по мере их создания

Grep в новых файлах журнала по мере их создания

Каждый час сервер создает новый файл журнала в формате syslog_all.yyyy-mm-dd-hh и архивирует файл за предыдущий час.

Мне нужен способ поиска определенной строки в текущих и еще не созданных файлах журнала без необходимости перезапускать команду каждый час только потому, что имя файла изменилось.

В настоящее время я занимаюсь:

tail -f syslog_all.2017-04-25-09 | egrep -i --line-buffered "string1" | egrep -i "(.*first.*|.*second.*|.*third.*)"

решение1

Вот рецепт высокого уровня.

  1. Настройте syslogd или rsyslogd (в зависимости от того, какой из них использует ваша система) для вывода требуемых сообщений о средствах/приоритетах в именованный канал в дополнение к тому, куда они направляются сейчас. Извлечение изman rsyslog.conf
Named pipes

   This  version  of  rsyslogd(8) has support for logging output to
   named pipes (fifos). A fifo or named pipe can be used as a  des‐
   tination  for  log messages by prepending a pipe symbol ('|') to
   the name of the file. This is handy for debugging. Note that the
   fifo  must  be  created  with the mkfifo(1) command before rsys‐
   logd(8) is started.

В моем случае есть пример/etc/rsyslog.d/50-default.conf

daemon.*;mail.*;\
    news.err;\
    *.=debug;*.=info;\
    *.=notice;*.=warn       |/tmp/rt_monitor
  1. Создайте именованный канал и используйте tail и grep для чтения и поиска в канале.

    mkfifo /tmp/rt_monitor; tail -f /tmp/rt_monitor | grep "alert string"

Вам следует проверить, продолжает ли работать система, если именованный канал заполняется, если у вас не запущен потребитель, и предотвратить возникновение этой ситуации. Я дал вам очень верный рецепт.

Связанный контент