Usando o tail para seguir o arquivo de log diário no Bash

3

Eu tenho uma tarefa para usar um script bash para monitorar alguns arquivos de log nomeados com o dia atual, por exemplo. AAAA-MM-DD.log.

(1) usei tail -f para seguir o arquivo, mas não consigo lidar com a rotação de arquivos.

Mesmo usando tail -F $FILENAME , só posso acompanhar o log por no máximo 24 horas e preciso reiniciar novamente.

O que desejo realizar é ter algo como tail -F $CURRENTDATE , para que eu possa deixá-lo funcionando para sempre e a cada meia-noite. Ele mudará para seguir o novo arquivo de log chamado com a data atual.

Mas parece que a variável $CURRENTDATE não é dinâmica. Existe outra maneira de fazer isso sem crontab 'ing o script a cada 24 horas? Talvez definir um arquivo simbólico ou algo assim?

(2) Enquanto isso, se tail -f for usado, que sinal retornará se o arquivo a seguir estiver faltando ou mudar seu nome? Como posso interceptar as exceções durante a execução?

    
por geledek 18.07.2013 / 03:51

2 respostas

3

A variável $CURRENTDATE não é dinâmica da maneira que você pensa. Essa variável é expandida quando o comando tail -F $CURRENTDATE é avaliado para ser executado. Você pode ver isso se você executar o comando ps , DEPOIS que ele for executado. Observe na saída que ele mostra o valor da data atual em vez de $CURRENTDATE .

$ CURRENTDATE=$(date +%Y%M%d.log)
$ tail -F $CURRENTDATE

$ ps -eaf|grep tail
saml      1171 13564  0 22:13 pts/4    00:00:00 tail -F 20130517.log

Esse problema que você está enfrentando normalmente é o motivo pelo qual a maioria dos daemons do servidor, como Apache, Nginx ou Jetty, registra toda a data atual em um arquivo denominado error.log e, em seguida, esse arquivo é girado para outro nome, como error_20130517.log depois.

Isso permite monitorar o error.log continuamente usando um comando como tail -F error.log .

    
por 18.07.2013 / 04:17
1

Isso é exatamente o que você está procurando:

watch -n 60 'tail -n 30 /path/to/logfile-$(date +%Y-%m-%d.log)'

Isso atualiza o arquivo de registro para a data atual a cada 60 segundos. Personalize os parâmetros n ao seu gosto. Observe as aspas simples: elas fazem com que o comando watch avalie o comando toda vez, em vez de avaliá-lo uma vez e fornecer saída. Eu me deparei com o mesmo problema e isso funcionou perfeitamente para mim. Eu não acho que a resposta atual de "Bem, os grandes jogadores não gostam de hackear para usar o logrotate" é uma solução adequada se você estiver tentando depurar um programa que registra dessa maneira, em vez do contrário. / p>

Esse é o jeito rápido e sujo, mas se você está desenvolvendo alguma coisa, faça como os grandes jogadores e use o logrotate.

    
por 08.07.2014 / 22:48

Tags