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

3

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.*)"

    
por Unit0 25.04.2017 / 11:24

1 resposta

2

Aqui está uma receita de alto nível.

  1. Configure o syslogd ou o rsyslogd (o que o seu sistema usar) para gerar as mensagens necessárias de facilidade / prioridade para um pipe nomeado além para onde vai agora. Extrair de 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.

Existe 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 a partir do 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 impedir que isso ocorra, eu lhe dei uma receita bem crua.

    
por 25.04.2017 / 16:26