
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.
- 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 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.
Há um exemplo no meu/etc/rsyslog.d/50-default.conf
daemon.*;mail.*;\
news.err;\
*.=debug;*.=info;\
*.=notice;*.=warn |/tmp/rt_monitor
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.