Desmistificando o journalctl: Seu Guia para os Logs do Sistema Linux

Aprenda comandos do journalctl para visualizar, filtrar, acompanhar e limpar logs do diário systemd do Linux.

Desmistificando o journalctl: Seu Guia para os Logs do Sistema Linux

O utilitário journalctl é o principal comando para visualizar logs coletados pelo systemd-journald. Quando um serviço falha, uma inicialização trava ou uma mensagem do kernel passa rápido demais, o journalctl é geralmente onde você encontra os detalhes.

Diferente dos arquivos de log em texto simples em /var/log, o diário armazena entradas estruturadas com metadados como nome da unidade, prioridade, ID de inicialização e timestamp. Isso permite filtrar logs com precisão, em vez de abrir vários arquivos e adivinhar.


Entendendo o Diário do Systemd

Antes de mergulhar nos comandos, é útil saber o que o journalctl está gerenciando. O diário do systemd coleta logs do kernel, serviços (unidades), aplicativos e até mesmo do processo de inicialização do sistema. Esses logs são normalmente armazenados em arquivos binários estruturados, tornando a busca e filtragem muito mais rápidas do que arquivos planos tradicionais.

Conceitos-chave:

  • Persistência: Os logs podem ser configurados para serem armazenados permanentemente entre reinicializações (modo persistente) ou mantidos apenas na memória (modo volátil).
  • Dados Estruturados: Os logs contêm metadados (como nome da unidade, prioridade, ID de inicialização) que o journalctl utiliza para filtragem.

Comandos Essenciais de Visualização

A necessidade mais comum é simplesmente visualizar os logs. Aqui estão os comandos fundamentais para começar a explorar o histórico do seu sistema.

1. Visualizando Todos os Logs

Para ver todas as entradas coletadas pelo diário desde que o sistema começou a registrar logs, use o comando sem argumentos:

journalctl

Por padrão, esta saída é paginada usando uma ferramenta como less, permitindo navegar para cima e para baixo usando as teclas de seta ou a barra de espaço.

2. Visualizando Logs em Tempo Real (Seguindo)

Semelhante ao uso de tail -f, você pode monitorar logs à medida que são escritos no diário. Isso é inestimável ao iniciar ou depurar um serviço específico:

journalctl -f

Para sair da visualização em tempo real, pressione Ctrl+C.

3. Limitando a Saída pelo Número de Linhas

Se você precisar apenas das entradas mais recentes, use a flag -n para especificar o número de linhas:

# Mostrar as últimas 20 entradas de log
journalctl -n 20

4. Visualizando Logs Desde um Horário Específico

Filtrar por tempo é um dos recursos mais fortes do journalctl. Você pode usar timestamps relativos ou absolutos.

Exemplos de Tempo Relativo:

Comando Descrição
journalctl --since "1 hour ago" Logs da última hora.
journalctl --since "yesterday" Logs do início do dia calendário anterior.
journalctl --since "2023-10-26 14:30:00" Logs após uma data e hora específicas.

Dica: Você pode combinar --since e --until para especificar um intervalo preciso, por exemplo: journalctl --since "2023-10-26" --until "2023-10-27 00:00:00".


Filtrando Logs por Unidade, Serviço ou Processo

Um dos usos mais críticos do journalctl é isolar mensagens relacionadas a uma unidade (serviço) específica do systemd.

Filtrando por Nome do Serviço

Use a flag -u (ou --unit) seguida pelo nome do serviço (ex.: sshd.service, nginx.service):

# Visualizar logs apenas para o serviço do servidor web Apache
journalctl -u apache2.service

# Seguir logs para o serviço Docker
journalctl -u docker.service -f

Filtrando por ID de Inicialização

O Systemd rastreia logs em diferentes inicializações do sistema. Para ver logs de uma inicialização anterior, primeiro liste as inicializações disponíveis:

journalctl --list-boots

Isso gera uma lista indexada (ex.: -1, -2, 0 para a inicialização atual). Você pode então usar o índice ou o ID completo da inicialização:

# Mostrar logs da inicialização imediatamente anterior
journalctl -b -1

# Mostrar logs de um ID de inicialização específico (use o ID longo listado acima)
journalctl -b a1b2c3d4e5f6...

Filtrando por Mensagens do Kernel

Para visualizar apenas mensagens originadas do kernel (semelhante a usar dmesg):

journalctl -k
# Ou, equivalentemente:
journalctl -b -k

Filtragem Avançada e Controle de Saída

A solução eficaz de problemas geralmente requer combinar filtros e controlar o formato de saída.

1. Filtrando por Nível de Prioridade

Os logs recebem níveis de prioridade de 0 (emerg) a 7 (debug). Você pode usar a flag -p ou --priority para visualizar mensagens na gravidade selecionada e níveis mais severos:

Nível de Prioridade Valor Numérico
err ou error 3
warning 4
notice 5
info 6
# Mostrar todos os erros, mensagens críticas e de emergência do serviço SSH
journalctl -u sshd.service -p err

2. Pesquisando por Texto Específico

Quando a filtragem padrão não é suficiente, você pode canalizar a saída para grep ou usar --grep em sistemas cuja versão do journalctl suporta:

# Pesquisar em todos os logs por linhas contendo a palavra 'failed'
journalctl | grep failed

# Ou, use a opção --grep para filtragem mais simples (se disponível/preferida)
journalctl --grep=failed

3. Alterando o Formato de Saída

Para scripts ou mover logs para outras ferramentas, alterar o formato de saída é essencial. O padrão é pretty (legível por humanos).

  • --output=json: Gera entradas como objetos JSON estruturados.
  • --output=short: Semelhante a pretty, mas menos colorido.
  • --output=export: Gera entradas brutas do diário para arquivamento.
# Gerar logs recentes como JSON
journalctl -n 5 --output=json

4. Combinando Filtros

Os filtros se acumulam de forma multiplicativa. Para ver todos os erros do Nginx registrados nos últimos 10 minutos:

journalctl -u nginx.service --since "10 minutes ago" -p err

Gerenciando o Tamanho e a Persistência do Diário

Com o tempo, o diário pode consumir espaço significativo em disco, especialmente se configurado para registro persistente. Os administradores de sistema devem gerenciar seu tamanho.

Verificando o Uso Atual

Para ver quanto espaço em disco os arquivos atuais do diário estão ocupando:

journalctl --disk-usage

Limpando Logs Antigos

Você pode limpar logs com base no tempo ou no tamanho total.

Limpeza por Tempo:

# Manter apenas logs dos últimos 7 dias
journalctl --vacuum-time=7d

Limpeza por Tamanho:

# Reduzir o tamanho total do log para no máximo 500 Megabytes
journalctl --vacuum-size=500M

Aviso: Tenha cuidado ao excluir logs, especialmente aqueles de inicializações mais antigas (-b). Certifique-se de que informações críticas de diagnóstico não sejam removidas prematuramente.

Conclusão

Para solução de problemas do dia a dia, comece com journalctl -u <serviço> -n 50 --no-pager, adicione -f quando precisar de saída ao vivo e use --since ou -b quando o problema estiver vinculado a uma janela de tempo ou inicialização. Antes de excluir logs, verifique journalctl --disk-usage e mantenha histórico suficiente para reversão e revisão de incidentes.