Técnicas Avançadas de Solução de Problemas com Systemd Journald
Solucione problemas de logs do systemd journal com filtros de tempo, seleção de inicialização, consultas de unidades, níveis de prioridade e exportações.
Técnicas Avançadas de Solução de Problemas com Systemd Journald
Depurar um host Linux baseado em systemd geralmente começa no journal. journalctl -xe pode mostrar falhas recentes, mas a solução de problemas real geralmente significa restringir logs por inicialização, intervalo de tempo, unidade, prioridade, processo ou executável.
Os exemplos abaixo mostram como transformar um journal grande em uma visão focada que você pode usar durante falhas de serviço, problemas de inicialização e erros recorrentes do sistema.
Entendendo o Journal: Estrutura e Localização
O systemd Journal agrega logs do kernel, serviços do sistema e aplicativos. Diferente dos arquivos syslog tradicionais, o Journal armazena logs em um formato binário indexado, o que permite consultas sofisticadas via journalctl. Os logs são normalmente persistidos em diretórios como /var/log/journal/.
Conceitos-chave para lembrar:
- Logs Estruturados: As entradas contêm campos de metadados (como
_PID,_COMM,_SYSTEMD_UNIT) que ojournalctlusa para filtragem. - Volátil vs. Persistente: Os logs podem ser armazenados apenas em memória (volátil) ou gravados em disco (persistente). A configuração padrão geralmente favorece a persistência.
Técnicas Essenciais de Filtragem Avançada
O poder do journalctl está na sua capacidade de restringir milhões de entradas de log. Aqui estão os filtros avançados mais eficazes.
1. Filtragem Baseada em Tempo
Intervalos de tempo são críticos ao diagnosticar problemas transitórios ou regressões de desempenho. Você pode especificar o tempo usando formatos absolutos ou âncoras relativas.
A. Tempo Relativo: Use -S (since/desde) e -U (until/até) para especificações de tempo relativo.
# Mostrar logs dos últimos 30 minutos
journalctl --since "30 minutes ago"
# Mostrar logs entre 10:00 de ontem e agora
journalctl -S yesterday -U now
# Mostrar logs de um intervalo de tempo específico (formato ISO 8601)
journalctl --since "2024-05-01 08:00:00" --until "2024-05-01 08:15:00"
B. Tempo Baseado em Inicialização: Para analisar uma sequência de inicialização problemática específica, use a flag -b.
# Mostrar logs apenas da inicialização atual
journalctl -b
# Mostrar logs da inicialização anterior
journalctl -b -1
# Mostrar logs do kernel da penúltima inicialização
journalctl -b -2 -k
2. Filtragem por Unidade e Serviço do Systemd
Para isolar logs pertencentes a um serviço específico, use a flag -u ou --unit. Isso é indispensável ao solucionar problemas de serviços com falha.
# Mostrar todos os logs para o serviço do servidor web Apache
journalctl -u httpd.service
# Mostrar logs para o serviço desde a última vez que foi iniciado
journalctl -u nginx.service --since "start of job -1"
3. Filtragem por ID do Processo (PID) e Nome do Executável
Quando um processo específico falha, mas você não sabe imediatamente a qual serviço ele pertence, filtrar por PID ou pelo nome do executável (_COMM) é altamente eficaz.
# Mostrar logs relacionados a um ID de processo específico (ex: PID 4589)
journalctl _PID=4589
# Mostrar logs para todos os processos chamados 'mysqld'
journalctl _COMM=mysqld
4. Filtragem por Nível de Prioridade
As entradas do Journal recebem prioridades numéricas (0=emerg, 7=debug). Use a flag -p para filtrar por gravidade, o que ajuda a suprimir saída de depuração excessiva ao procurar erros.
| Nível de Prioridade | Palavra-chave | Valor Numérico |
|---|---|---|
| Emergency | emerg | 0 |
| Alert | alert | 1 |
| Critical | crit | 2 |
| Error | err | 3 |
| Warning | warning | 4 |
| Notice | notice | 5 |
| Info | info | 6 |
| Debug | debug | 7 |
# Mostrar apenas erros críticos (nível 2) e acima para o sistema
journalctl -p crit
# Mostrar todos os logs, exceto mensagens de depuração
journalctl -p 6
Analisando Falhas de Inicialização e Mensagens do Kernel
Solucionar problemas de inicialização do sistema requer separar falhas de serviços em espaço de usuário de problemas de inicialização do kernel ou hardware.
Isolando Mensagens do Kernel (-k ou --dmesg)
A flag -k exibe apenas mensagens do kernel (equivalente a executar dmesg). Isso é crucial para identificar problemas relacionados a drivers de dispositivo, reconhecimento de hardware ou falhas de inicialização precoce antes mesmo do systemd carregar os serviços.
# Revisar todas as mensagens do kernel da inicialização atual
journalctl -k
# Procurar erros específicos de hardware no log do kernel da inicialização anterior
journalctl -k -b -1 | grep -i "error"
Rastreando Dependências de Serviço
Quando um serviço falha ao iniciar, pode ser devido a uma dependência upstream com falha. Use a exibição reversa (-r) combinada com filtragem de unidade para ver a sequência que leva à falha.
# Exibir logs para uma unidade em ordem cronológica reversa
journalctl -u my-app.service -r
Formatação Avançada de Saída e Exportação
Para análise mais aprofundada ou compartilhamento de logs, modificar o formato de saída é essencial.
1. Visualizando como JSON (-o json)
Para scripts ou integração com ferramentas externas de análise de log, a saída JSON estruturada é preferida.
journalctl -u sshd.service -o json
2. Visualizando como Linha Única (-o cat)
Para obter uma saída limpa e bruta sem timestamps ou metadados (útil ao canalizar diretamente para outras ferramentas como grep), use o formato cat.
journalctl -u cron.service -o cat
3. Exportando Logs
Para arquivar ou transferir logs, exporte-os para um arquivo de texto padrão. Se você precisar de campos de metadados específicos, escolha um formato de saída que inclua campos estruturados.
# Exportar todos os logs da inicialização atual para um arquivo de texto
journalctl -b > boot_log_$(date +%F).txt
# Exportar campos estruturados selecionados para uma unidade
journalctl -u mariadb.service -o json --output-fields=__REALTIME_TIMESTAMP,PRIORITY,_PID,_COMM,MESSAGE --since today > mariadb_recent.json
Melhores Práticas para Gerenciamento do Journal
Gerenciar o tamanho do Journal é crucial para evitar o esgotamento do espaço em disco, especialmente em sistemas com alto volume de logs.
- Verificar Uso: Determine o consumo atual de disco do Journal:
journalctl --disk-usage - Limpar Logs Antigos: Limite o tamanho do Journal por tempo ou uso de disco usando comandos
vacuum:# Manter apenas logs dos últimos 7 dias sudo journalctl --vacuum-time=7d # Reduzir o uso de disco para no máximo 500MB sudo journalctl --vacuum-size=500M
Use os filtros do journal como uma ferramenta de restrição: escolha a inicialização, janela de tempo, unidade e prioridade primeiro, depois mude o formato de saída apenas quando precisar arquivar ou analisar o resultado.