Alternativa para "tail -f" que segue o nome do arquivo


59

Tenho alguns logs sendo gerados usando um registrador de arquivos rotativo cronometrado. Isso registra um arquivo chamado tool.loge, à meia-noite, move isso para tool.log.<date>e inicia um novo tool.log.

Tenho uma tail -f tool.logmáquina em execução para ficar de olho nos logs, mas à meia-noite, quando tool.logé renomeada para tool.log.<date>, tailcontinua a assistir o arquivo renomeado.

O que eu estou esperando é uma ferramenta semelhante tail, mas continuará a monitorar o arquivo nomeado tool.log, em vez de seguir o inode.

Será que algo assim existe? Caso contrário, posso escrever meu próprio em Python para esse fim.

Respostas:


90

Algumas implementações de tailtêm uma opção para isso; aqui está a descrição da página de manual do GNU tail:

-F
igual a --follow=name --retry

-f, --follow[ ={ name | descritor }]
gera dados anexados à medida que o arquivo cresce; -f, --followe --follow=descriptorsão equivalentes

--retry
continue tentando abrir um arquivo mesmo quando ele estiver ou se tornar inacessível; útil ao seguir pelo nome, ou seja, com--follow=name

Como essa opção não é especificada pelo POSIX, você não pode depender dela em qualquer lugar. Algumas implementações conhecidas:

  • GNU - tem-Fcomo descrito acima
  • Mac OS X , FreeBSD e NetBSD - têm uma-Fopçãosemelhantecom o mesmo efeito
  • OpenBSD --fé suficiente (se o arquivo for substituído (ou seja, o número do inode for alterado), o tail reabrirá o arquivo e continuará)
  • Solaris - sem equivalente
  • Busybox --Festá disponível em versões recentes, mas deve ser compiladoENABLE_FEATURE_FANCY_TAIL(por padrão não é compilado)

55

Alternativa é tail -Fcomando.

A -Fopção implica --follow=nameem --retryopção, portanto o tail está assistindo seu arquivo, mesmo que ele tenha sido excluído e criado novamente.


5

Desde que você pediu uma alternativa :

O lessutilitário pode ser uma alternativa para tail -F.

Ele deve ser executado da seguinte maneira: less --follow-name filename.loge pressione Shift+ F.

Isso fornecerá os mesmos resultados que tail -F.


Obrigado. Eu só estava atrás de uma alternativa porque não tinha consciência da cauda -F. Sempre é bom saber as opções.
Hugh

4

Outra alternativa seria usar o watchcomando, que repetirá qualquer comando a cada n segundos, a cada 2 segundos neste exemplo:

watch -n2 "tail tool.log"

Use Ctrl+ Cpara sair do comando quando terminar de visualizar o log.


11
Parece que isso criaria muitas mensagens duplicadas se o log rolasse mais devagar que o timer de atualização e perderia algumas mensagens se rolasse mais rapidamente.
Bobson 31/03

3
O Watch ocupa a tela inteira, para que não duplique as mensagens, mas remove a capacidade de rolar para trás.
Hugh

3

INAV é outra ferramenta fantástica que segue o nome do arquivo.

Você também pode apontá-lo para um diretório e ele seguirá todos os arquivos nesse diretório, além de todos os tipos de outros recursos interessantes.


Descobri que ele não lida com logs truncados e / ou renomeados (não tenho certeza do que o está perturbando no meu caso em particular); portanto, os logs parecem parar à meia-noite, a menos que eu reinicie o lnav. Estou perdendo alguma mudança ou técnica óbvia para isso, imagino que isso pareça algo que deve levar em seu progresso?
Stuart Hickinbottom

Depende de como o arquivo está truncado. Se você passar o -rsinalizador para o lnav, ele recarregará o nome do arquivo (e carregará os logs rotacionados anteriormente)
Wayne Werner

1

Não tenho certeza se multitailvai lidar com o seu caso específico, mas aposto que sim. O multitail faz praticamente tudo o que você poderia querer tailfazer.

https://en.wikipedia.org/wiki/MultiTail


11
Sim, vai - multitail -f <name1> -f <name2> -f <name3> .... Este exemplo mostra a seguir vários arquivos simultaneamente, que serão mostrados em janelas separadas.
Stuart Hickinbottom
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.