É bom usar tail -f em arquivos de log grandes


9

Gostaria de monitorar um arquivo de log grande (próximo a 1 GB) quanto a erros. Eu quero que isso seja quase em tempo real (alguns segundos de atraso é bom). Meu plano é usar tail -f | grep. Há algum problema de desempenho ao usar esse método ao executá-lo por um longo período, digamos de zero bytes a 1 GB? Existem práticas padrões usadas para esse monitoramento. Observe que eu gostaria de fazer isso usando comandos unix padrão disponíveis no Solaris 10.

Se isso for possível, meu arquivo ainda rola e eu tenho mais um problema para resolver :). using tail -F( --follow=name) não é uma opção para mim porque -Fnão é suportado no servidor em que desejo executar isso. Meu plano é usar um script que inicie essa cauda e faça uma pesquisa para descobrir se o arquivo está rolando. Se sim, então mate o rabo e reinicie-o. Alguma abordagem melhor?


Você quer dizer "matar o tail", certo?
Stéphane Gimenez

Sim, "matar cauda", não encontrar. Obrigado, editou a pergunta
Manoj NV

11
Se um arquivo com tamanho de 2 GB não contém um novo caractere de linha, como funciona a cauda?

Respostas:


6

No meu sistema Linux (GNU coreutils 8.12), pude verificar (usando strace) se tail -f¹ usa a lseekchamada do sistema para pular a maior parte do arquivo rapidamente:

lseek(3, 0, SEEK_CUR)                   = 0
lseek(3, 0, SEEK_END)                   = 194086
lseek(3, 188416, SEEK_SET)              = 188416

Isso significa que o tamanho do arquivo rastreado não deve importar de forma alguma.

Talvez você possa verificar se o mesmo se aplica ao seu sistema. (Obviamente, deve ser o caso.)

-
1. Tentei também desativar o suporte para inotificar os não documentados ---disable-inotify, apenas por precaução.


2
Homens reais leem a fonte (:
Gilles 'SO- stop be evil'

2
@Gilles. Não posso ensinar ao OP (ou ao leitor) como ler a fonte, se ele ainda não souber. Muito mais fácil dizer a ele para usar strace;)
Stéphane Gimenez

Na verdade, em um sistema onde tail -Fnão é suportado, as chances são de que stracenão está disponível ...
Stéphane Gimenez

trussé o utilitário correspondente no Solaris.
Gilles 'SO- stop be evil'

e mostra chamadas de busca semelhantes. llseek (0, 0, SEEK_CUR) = 0, llseek (0, 0xFFFFFFFFFFF5FFF6, SEEK_END) = 7923269
jlliagre

5

Se for invocado em um arquivo regular (em oposição a um pipe), tanto a cauda GNU quanto a cauda do OpenBSD (a menos que seja chamada com -n +N) procuram o final do arquivo, depois trabalham para trás para encontrar a linha onde deve começar a imprimir. Não sei se o Solaris faz o mesmo, mas é uma abordagem razoável, por isso espero que a maioria das empresas faça o mesmo. Portanto, o tamanho do arquivo é irrelevante para o desempenho.


2

Eu faço isso todos os dias. Geralmente, varro uma dúzia de logs nos nossos servidores de teste e produção usando tail -f logs/*.{log,err,out}. O carregamento inicial é um pouco demais (dependendo do número de arquivos globbed), mas depois disso, o streaming é em tempo real.

Em vez de enviar para o grep, uso a execfuncionalidade, screenpois geralmente desejo ver toda a saída (para rastreamentos completos e mensagens relacionadas ao problema). Por exemplo,

!:sed -n s/.*Exception.*/\007/p

Para fazer o terminal emitir um bipe (ou piscar) sempre que a palavra Exceção for encontrada.

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.