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