Como usar o journalctl para investigar falhas no sistema
1. Introdução ao journald e journalctl
O systemd-journald é o subsistema de registro de logs do systemd, presente na maioria das distribuições Linux modernas. Diferente dos logs tradicionais baseados em texto (syslog), o journal armazena dados em formato binário estruturado, permitindo consultas rápidas, filtros avançados e correlação de eventos com metadados ricos.
O journalctl é a ferramenta de linha de comando para acessar e manipular esses logs. Para verificar se está instalado:
journalctl --version
Saída esperada:
systemd 252 (252.5-2ubuntu1)
PAM -PIE -lz4 -XZ -ZSTD +PAM
2. Comandos básicos de consulta e filtragem
Para visualizar todos os logs do sistema:
journalctl
Para listar os boots disponíveis e selecionar um específico:
journalctl --list-boots
Exemplo de saída:
-1 1a2b3c4d... Tue 2024-01-15 08:30:00 BRST—Tue 2024-01-15 10:45:00 BRST
0 5e6f7g8h... Tue 2024-01-15 10:45:00 BRST—Wed 2024-01-16 09:15:00 BRST
Para filtrar logs do boot atual:
journalctl -b 0
Filtrando por data e hora:
journalctl --since "2024-01-15 09:00:00" --until "2024-01-15 12:00:00"
Formatos aceitos: "yesterday", "today", "1 hour ago", "2024-01-15".
3. Filtrando logs por unidade, serviço e prioridade
Para logs de um serviço específico:
journalctl -u nginx.service
Combinando múltiplas unidades:
journalctl -u nginx.service -u postgresql.service
Filtrando por nível de gravidade (prioridade):
journalctl -p err # apenas erros
journalctl -p emerg # apenas emergências
journalctl -p 0..3 # emerg, alert, crit, err
Os níveis numéricos seguem o padrão syslog: 0=emerg, 1=alert, 2=crit, 3=err, 4=warning, 5=notice, 6=info, 7=debug.
4. Investigação de falhas com foco em erros e kernel
Para identificar erros críticos recentes:
journalctl -b -p 0..3
Analisando mensagens do kernel:
journalctl -k
Combinando com prioridade:
journalctl -k -p err
Usando a flag -x para obter explicações detalhadas dos erros:
journalctl -xe -p err
Isso ativa o catálogo de mensagens do systemd, que fornece descrições legíveis para códigos de erro.
5. Navegação avançada e saída formatada
Dentro do pager (less), use:
- Shift+G para ir ao final
- g para ir ao início
- /termo para buscar
- n para próximo resultado
- q para sair
Formatando a saída:
journalctl -o json-pretty # JSON formatado
journalctl -o verbose # todos os campos
journalctl -o short-iso # timestamp ISO compacto
Exportando logs para análise externa:
journalctl -b -p err --output=export > logs_erro.txt
6. Uso de flags de depuração e correlação de eventos
Rastreando logs de um PID específico:
journalctl _PID=1234
Filtrando por identificadores do systemd:
journalctl _SYSTEMD_UNIT=sshd.service
journalctl _COMM=nginx
Correlacionando logs entre serviços com --grep:
journalctl -u nginx.service -u php-fpm.service --grep="error|failed" --case-sensitive=false
7. Manutenção, rotação e limpeza do journal
Verificando uso de disco:
journalctl --disk-usage
Saída:
Archived and active journals take up 128.0M in the file system.
Limpeza manual:
journalctl --vacuum-size=100M # mantém apenas 100MB
journalctl --vacuum-time=7days # mantém logs dos últimos 7 dias
Configuração permanente no /etc/systemd/journald.conf:
SystemMaxUse=200M
MaxRetentionSec=1month
Após alterar, reinicie o serviço:
systemctl restart systemd-journald
8. Exemplos práticos de investigação de falhas comuns
Exemplo 1: Falha de serviço que não inicia
journalctl -u apache2.service -b 0 --no-pager | tail -20
Se o serviço falhou, procure por linhas como:
abr 15 10:30:01 servidor apache2[1234]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
abr 15 10:30:01 servidor apache2[1234]: no listening sockets available, shutting down
Exemplo 2: Kernel panic ou travamento do sistema
Extraia logs do último boot antes do crash:
journalctl -b -1 -k -p err --no-pager
Procure por mensagens como:
kernel: BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
kernel: RIP: 0010:nvme_submit_cmd+0x1a/0x40 [nvme]
Exemplo 3: Erros de hardware (disco, memória)
Filtrando por device específico:
journalctl -k --grep="sd[a-z]|nvme|ata" -p err
Para erros de memória:
journalctl -k --grep="EDAC|mce|Memory Error" -b
Esses comandos revelam problemas como setores defeituosos, falhas de controladora ou erros ECC.
Referências
- Documentação oficial do systemd-journald — Guia completo de configuração e manutenção do journald.
- Página man do journalctl — Referência detalhada de todas as opções e flags do comando.
- Tutorial da DigitalOcean sobre journalctl — Guia prático com exemplos de filtragem e análise de logs.
- Guia da Red Hat para diagnóstico de falhas — Documentação corporativa com cenários reais de troubleshooting.
- Artigo sobre análise de kernel panic com journalctl — Tutorial específico para extrair logs de travamentos do kernel.
- Referência de prioridades e facilidades no syslog — Padrão RFC que define os níveis de severidade usados pelo journald.