Então, estou trabalhando com tail -F (ou tail --follow=filename). Agora funciona como anunciado e quando ocorrer uma sobreposição, ele passará para o novo arquivo.
Isso é ótimo e me ajuda a controlar meus registros. A questão é que quero saber quando tail passa do arquivo antigo para o novo.
A situação é a seguinte:
Eu tenho um arquivo de log enorme que leva 15 minutos para ser processado. Agora digamos que no minuto 5 ocorra um rollover. Tail tem a descrição do arquivo aberta e a usa para concluir o processo de tailing e depois passa para o novo.
Agora mantenho um histórico de qual arquivo e qual linha registrei pela última vez. Faço isso aumentando o número de processos em linhas (é um programa multiprocesso, mas o que mais posso fazer?).
O problema é que após o rollover, o novo arquivo começa na linha 0, mas meu line_number já aumentou para 5 milhões. Portanto, para este novo arquivo que contém, digamos, 100 logs, armazenarei o número da linha como 5.000.100.
Usei o watchdog para descobrir quando o arquivo é transferido para redefinir o número da linha para 0, mas caso o rollover aconteça durante a execução inicial, como, digamos, na marca de 5 minutos da execução de 15 minutos, ainda acabo com um número de 3mil +.
Como line_number é usado para continuar de onde saà pela última vez, caso o programa morra acidentalmente, isso pode significar perda de dados.
Apenas para observar: estou executando este comando em python (CPython)
Redirecione
stderr
de tail parastdout
e lide com o comentário quetail -F
fornece.Seu código Python agora deve receber mensagens como:
YMMV: As cotações parecem não confiáveis ​​e pode haver uma condição de corrida quando o arquivo é transferido. Mas
file truncated
deverá ser seguida por uma nova Linha 1.