Grep em novos arquivos de log à medida que são criados

Grep em novos arquivos de log à medida que são criados

A cada hora, o servidor cria um novo arquivo de log no formato syslog_all.yyyy-mm-dd-hh e arquiva o arquivo da hora anterior.

O que eu preciso é uma maneira de percorrer os arquivos de log atuais e ainda a serem criados para uma determinada string sem ter que reiniciar o comando a cada hora apenas porque o nome do arquivo foi alterado.

Atualmente eu faço:

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

Responder1

Aqui está uma receita de alto nível.

  1. Configure syslogd ou rsyslogd (o que seu sistema usar) para enviar as mensagens de recurso/prioridade necessárias para um canal nomeado, além de onde ele vai agora. Extraído deman 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.

Há um exemplo no meu/etc/rsyslog.d/50-default.conf

daemon.*;mail.*;\
    news.err;\
    *.=debug;*.=info;\
    *.=notice;*.=warn       |/tmp/rt_monitor
  1. Crie um pipe nomeado e use tail e grep para ler e pesquisar no pipe.

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

Você deve verificar se o sistema continua se o pipe nomeado ficar cheio, se você não tiver seu consumidor em execução e evitar que isso ocorra, eu lhe dei uma receita muito crua.

informação relacionada