Linux / Comando tail: últimas linhas de arquivos e acompanhamento de logs
tail é um comando do Linux usado para verificar a parte final de um arquivo. Se executado sem opções, ele exibe as últimas 10 linhas. Você pode especificar o número de linhas com -n e monitorar continuamente logs recém-adicionados com -f ou -F.
É particularmente útil para verificar rapidamente os logs pouco antes de ocorrer um problema ou para observar os logs de um serviço em execução. Neste artigo, explicamos os conceitos básicos da sintaxe, métodos de rastreamento considerando a rotação de logs, filtragem e monitoramento de múltiplos arquivos com exemplos práticos.
Comando tail
tail exibe a última parte do texto de entrada. Se nenhum arquivo for especificado ou - for usado no lugar de um arquivo, ele lê da entrada padrão. A unidade de saída padrão é linhas, e sem quaisquer opções específicas, ele exibe as últimas 10 linhas.
É conveniente para verificar a parte final de arquivos de log grandes sem abrir o arquivo inteiro. No entanto, tail não é uma ferramenta para analisar ou arquivar logs; é uma ferramenta para ler o final de um arquivo e acompanhar suas alterações.
Sintaxe básica e uso
A sintaxe básica é a seguinte. Colchetes indicam itens opcionais e não devem ser incluídos no comando real.
tail [options] [file...]
Por exemplo, para verificar as últimas 10 linhas de /var/log/app.log, execute o seguinte.
tail /var/log/app.log
Se você precisar das últimas 20 linhas, especifique o número de linhas com a opção -n.
tail -n 20 /var/log/app.log
Você pode escrevê-lo de forma abreviada como -20, mas em scripts e documentos, o formato mais legível -n 20 é mais claro.
Como imprimir apenas o intervalo desejado
Imprimir as últimas N linhas
-n N imprime N linhas do final do arquivo. É usado para verificar solicitações ou erros recentes em determinado intervalo.
tail -n 50 access.log
Se você quiser ler a saída página por página, pode direcioná-la para less.
tail -n 500 access.log | less
Imprimir da N-ésima linha até o final
Adicionar um sinal de mais antes do número -n +N tem um significado diferente. Em vez de imprimir as últimas N linhas, ele imprime da N-ésima linha do arquivo até o final.
tail -n +2 data.csv
Este exemplo imprime a partir da segunda linha de um arquivo CSV, excluindo a primeira linha, que é o cabeçalho. Pode ser facilmente usado ao pular a primeira linha em um pipeline.
Aqui, CSV significa um arquivo de valores separados por vírgulas. O comando remove uma linha física: ele não interpreta campos CSV nem registros com quebras de linha dentro de aspas. Use um leitor de CSV quando essa distinção for importante.
Saída por bytes em vez de linhas
-c N exibe os últimos N bytes em vez de linhas. Você pode usar sufixos como K ou M.
tail -c 1K output.bin
-c +N exibe a partir do N-ésimo byte até o final. Se você cortar por bytes, um caractere multibyte pode ser dividido no meio, então geralmente é mais seguro usar -n para texto multibyte.
Visualizar continuamente logs recém-adicionados
Acompanhar continuamente o arquivo aberto com -f
-f primeiro exibe o final do arquivo, depois continua a mostrar qualquer novo conteúdo adicionado ao arquivo. O comportamento padrão segue o descritor de arquivo aberto, tornando-o adequado para situações em que os logs são continuamente acrescentados ao mesmo arquivo.
tail -f /var/log/app.log
Para parar de rastrear, pressione Ctrl+C.
Gerencie a rotação de logs com -F
Em um ambiente operacional, os arquivos de log podem mudar de nome e serem substituídos por novos arquivos após atingirem determinado tamanho ou período. Isso é chamado de rotação de logs. A opção -F do GNU tail equivale a --follow=name --retry, que tenta reabrir com base no nome do arquivo.
tail -F /var/log/app.log
Portanto, ao observar logs de serviço frequentemente rotacionados por um longo período, -F é muitas vezes mais prático que -f. Esse comportamento pode ser verificado na documentação oficial do GNU Coreutils tail.
Visualizando apenas novos logs sem o conteúdo existente
Se as últimas 10 linhas do conteúdo existente não forem necessárias ao executar -f, use -n 0 juntamente. Apenas as linhas adicionadas após a execução do comando serão exibidas.
tail -n 0 -f /var/log/app.log
Opções frequentemente usadas
| Opção | Função | Exemplos de Uso |
|---|---|---|
-n N |
Imprimir as últimas N linhas | tail -n 100 app.log |
-n +N |
Imprimir a partir da N-ésima linha | tail -n +2 data.csv |
-c N |
Imprimir os últimos N bytes | tail -c 2K data.bin |
-f |
Rastrear conteúdo adicional de um arquivo aberto | Observar um único arquivo sendo continuamente escrito |
-F |
Rastrear e tentar novamente com base no nome do arquivo | Observar logs rotacionados |
-s N |
Definir o intervalo de verificação de rastreamento para N segundos | tail -f -s 2 app.log |
--pid=PID |
Encerrar o rastreamento após o término do processo especificado | Usar com logs de jobs em lote |
-q |
Ocultar cabeçalhos de nomes de arquivos | Tratar múltiplas saídas de arquivos como uma |
-v |
Sempre exibir cabeçalhos de nomes de arquivos | Distinguir claramente arquivos de origem |
A opção -s ajusta a espera entre verificações quando o acompanhamento usa consulta periódica. Com o mecanismo inotify do kernel, as alterações podem ser notificadas diretamente e esse intervalo de consulta geralmente não se aplica.
O suporte às opções pode variar dependendo do sistema operacional e da implementação do tail. Especialmente ao usar -F e --pid em um script, é recomendado verificar o suporte no sistema alvo com tail --help.
Exemplos práticos para consultar logs
Encontre apenas os erros recentes
Primeiro, leia apenas as últimas 200 linhas, depois use grep para filtrar strings de erro, a fim de reduzir a necessidade de procurar em logs antigos grandes.
tail -n 200 app.log | grep 'ERROR'
Para ignorar maiúsculas e minúsculas, use grep -i e, se números de linha forem necessários, use grep -n.
Acompanhe continuamente as linhas de erro
Se você quiser acompanhar logs rotacionados e ver apenas as linhas de erro, combine os comandos da seguinte forma. A opção --line-buffered do GNU grep ajuda a reduzir o atraso na saída no pipe, passando cada linha imediatamente.
tail -F app.log | grep --line-buffered 'ERROR'
Este método apenas limita o que é exibido na tela e não modifica o log original. Se você precisar de múltiplas condições ou de uma análise estruturada de logs, é melhor considerar ferramentas dedicadas de coleta e pesquisa de logs.
Acompanhe vários arquivos de log ao mesmo tempo
Você pode especificar múltiplos arquivos com tail. Neste caso, um cabeçalho de nome de arquivo é exibido para que você possa identificar de qual arquivo a saída vem.
tail -F access.log error.log
Para tornar a saída de cada arquivo mais distinta, adicione -v, e se o cabeçalho for desnecessário, use -q.
Encerre o rastreamento quando o processo terminar
No GNU tail, você pode usar --pid para parar de seguir um arquivo depois que um processo específico tiver terminado. No exemplo a seguir, $! contém o identificador (PID) do processo em segundo plano executado mais recentemente no shell.
Substitua some_command pelo comando real que escreve o log. O processo acompanhado e o tail precisam estar na mesma máquina; informe o PID do processo que realmente grava o arquivo.
some_command > build.log 2>&1 &
tail --pid=$! -f build.log
A opção --pid é usada junto com -f, e a detecção de término pode não ocorrer imediatamente. Na automação, você também deve verificar separadamente o código de saída do comando e os arquivos de log.
A diferença entre -f e -F
| Categoria | -f |
-F |
|---|---|---|
| Critérios de rastreamento | Basicamente, um descritor de arquivo aberto | O nome de arquivo especificado |
| Substituição de arquivo | Pode continuar a ver o arquivo previamente aberto | Abrir novamente um novo arquivo criado com o mesmo nome |
| Arquivo temporariamente ausente | Continua no descritor aberto, sem passar automaticamente a um novo arquivo | Aguarda o reaparecimento com --retry |
| Situações recomendadas | Observação de curto prazo de arquivos que não são substituídos | Observação de longo prazo de logs de serviço rotacionados |
Se a política de rotação esvaziar o mesmo arquivo, em vez de substituí-lo por outro, tanto o acompanhamento por descritor quanto por nome podem detectar o truncamento e retomar a leitura desde o início. Identifique qual método de rotação o serviço usa.
-F nem sempre é melhor. Em casos especiais em que um processo continua escrevendo em um arquivo existente cujo nome foi alterado, manter o arquivo aberto com -f pode mostrar melhor o que é necessário. A escolha deve ser baseada no método de geração de logs e na política de rotação.
Quando tail não é adequado
- Journal do systemd: Se os logs forem armazenados no journal em vez de como arquivos de texto simples, use
journalctl -f. Para serviços específicos, você pode restringir usandojournalctl -f -u service_name. - Verificando o início: Para as primeiras linhas de um arquivo,
headé mais direto. - Leitura com navegação: Para verificar tanto o conteúdo antigo quanto o novo,
less +F filenamepode ser conveniente. Pare de seguir com Ctrl+C, mova-se para cima e para baixo, e retome o acompanhamento com F. - Atualização periódica da saída de um comando: Se você quiser verificar repetidamente os resultados mais recentes de um comando, em vez de partes adicionais de um arquivo, usar o comando watch do Linux (em inglês) é mais adequado para este propósito.
- Centralização de logs em grande escala: Se você precisar pesquisar, agregar e gerar alertas com base em logs de múltiplos servidores durante um longo período, um sistema central de logs ou uma ferramenta de observabilidade é necessário.
Permissões e cuidados no ambiente de operação
Erro Permission denied
Se você não tiver permissão de leitura para o arquivo de log, ocorrerá um erro Permission denied. Primeiro, verifique o proprietário e as permissões com ls -l filename e solicite com segurança as permissões necessárias ao administrador. Evite ampliar permissões indiscriminadamente ou prefixar cada comando com sudo.
Dados sensíveis na saída dos logs
Tokens de autenticação, IDs de sessão e informações pessoais podem estar incluídos nos logs. Certifique-se de que valores sensíveis não estejam expostos em compartilhamentos de tela, históricos de terminal ou mensagens de erro copiadas. Ao compartilhar logs operacionais externamente, extraia apenas o escopo necessário e anonimize os valores sensíveis.
Perguntas frequentes
Quantas linhas o tail exibe por padrão?
Se nenhuma opção for especificada, ele exibe as últimas 10 linhas. Se você precisar de um número diferente, você pode especificar o número de linhas após -n, por exemplo tail -n 30 filename.
Como você para o tail -f?
Pressione Ctrl+C para parar o rastreamento em execução e retornar ao prompt do shell. Esta ação não exclui nem modifica o arquivo de log.
Por que não vejo novos conteúdos após a rotação do log?
Pode ser porque -f continua a rastrear o descritor do arquivo antes de ser substituído. Tente usar o GNU tail -F filename para reabrir o novo arquivo com base no nome do arquivo. Se ainda assim não aparecer, você precisará verificar o caminho real do log e as configurações de saída do serviço.
O tail pode ser usado em arquivos de log comprimidos?
tail não descompacta automaticamente formatos compactados. Você pode descompactar o arquivo inteiro e passá-lo através de um pipe, mas isso pode ser ineficiente para arquivos grandes. Por exemplo, um arquivo gzip pode ser verificado com zcat archive.log.gz | tail -n 50.
Resumo
Para verificar rapidamente o conteúdo recente, use tail filename e, para especificar o número de linhas, use tail -n N filename. Para visualizar continuamente novos logs, use -f, e se o arquivo for substituído devido à rotação de logs, considere usar tail -F do GNU Coreutils.
Ao se conectar com grep, você pode filtrar apenas as mensagens necessárias, mas tenha cuidado com permissões e exposição de informações sensíveis. Se você quiser aprender outras ferramentas básicas também, pode consultar Lista de comandos frequentemente usados no Linux (em inglês).




