Voltar ao Diminua Blog

Artigo

Dominando o `journalctl` no Linux: Navegando e Analisando Logs do Systemd com Maestria

Um guia aprofundado para extrair informações valiosas dos logs do systemd, essencial para o diagnóstico e a manutenção de sistemas Linux.

Dominando o `journalctl` no Linux: Navegando e Analisando Logs do Systemd com Maestria

Introdução ao `journalctl` e ao Systemd

O systemd se tornou o sistema de init e gerenciador de serviços padrão na maioria das distribuições Linux modernas. Uma de suas funcionalidades mais importantes é o systemd-journald, um serviço responsável pela coleta e armazenamento de logs de todo o sistema. Diferentemente dos tradicionais arquivos de log baseados em texto (como os encontrados em /var/log/), o journald armazena logs em um formato binário indexado, permitindo consultas mais rápidas e eficientes.

O comando journalctl é a ferramenta de linha de comando principal para interagir com o journald. Ele permite visualizar, filtrar e analisar os logs do sistema de maneira poderosa e flexível. Dominar o journalctl é crucial para qualquer administrador de sistemas Linux que precise diagnosticar problemas, monitorar o desempenho ou auditar a segurança do servidor.

Comandos Básicos de Visualização

A forma mais simples de usar o journalctl é sem argumentos, o que exibirá todos os logs registrados, do mais recente para o mais antigo. No entanto, essa visualização pode ser avassaladora devido ao grande volume de informações.

journalctl

Para ver logs em tempo real, semelhante ao comando tail -f, utilize a opção -f:

journalctl -f

Esta opção é extremamente útil para monitorar eventos à medida que eles ocorrem, especialmente durante a inicialização do sistema ou ao testar novas configurações de serviço.

Filtrando Logs por Serviço e Unidade

Uma das grandes vantagens do journalctl é a capacidade de filtrar logs com base em diversas propriedades, como a unidade (serviço) que gerou o log. Para visualizar logs de um serviço específico, use a opção -u (unit):

journalctl -u nginx.service

Este comando exibirá apenas os logs gerados pelo serviço Nginx. Você pode substituir nginx.service por qualquer outro serviço instalado no seu sistema, como ssh.service, apache2.service ou um serviço customizado.

É possível filtrar por múltiplos serviços:

journalctl -u nginx.service -u php-fpm.service

Para ver logs de uma unidade específica do systemd (que pode ser um serviço, um socket, um timer, etc.), utilize a opção -U (Unit):

journalctl -U minha-aplicacao.service

Filtrando Logs por Tempo

O journalctl oferece opções robustas para filtrar logs por período de tempo. Isso é fundamental para isolar eventos que ocorreram em um intervalo específico, ajudando a correlacionar problemas com ações realizadas.

Para ver logs do último dia:

journalctl --since "1 day ago"

Para ver logs de um período específico:

journalctl --since "2023-10-26 10:00:00" --until "2023-10-26 12:00:00"

Você também pode usar formatos mais flexíveis, como:

journalctl --since "yesterday" --until "today"

Para ver logs desde um ponto específico no tempo:

journalctl --since "2023-10-25"

Essas opções de tempo são extremamente úteis para investigar quando um problema começou ou para verificar a atividade em torno de uma determinada operação.

Filtrando Logs por Prioridade e Mensagem

A capacidade de filtrar logs pela sua prioridade (nível de severidade) é outra funcionalidade poderosa. As prioridades seguem o padrão syslog:

  • emerg (0): Sistema inutilizável
  • alert (1): Ação necessária imediatamente
  • crit (2): Condições críticas
  • err (3): Erros
  • warning (4): Avisos
  • notice (5): Notificações normais, mas significativas
  • info (6): Mensagens informativas
  • debug (7): Mensagens de depuração

Para ver apenas logs de erro e acima:

journalctl -p err

Para ver logs de aviso e acima:

journalctl -p warning

Você também pode filtrar logs que contenham um determinado padrão de texto usando a opção -g ou simplesmente combinando com grep:

journalctl -g "erro de autenticação"

Ou, usando grep para um controle mais fino:

journalctl | grep "erro de autenticação"

Embora usar grep diretamente no output do journalctl pareça simples, filtrar diretamente com -g é geralmente mais eficiente, pois o journalctl pode otimizar a busca nos dados indexados do journal.

Configurando a Persistência dos Logs

Por padrão, o systemd-journald pode ser configurado para armazenar logs de forma volátil (em memória) ou persistente (em disco). Para verificar o modo de armazenamento atual, você pode inspecionar o arquivo de configuração principal:

cat /etc/systemd/journald.conf

Se a linha Storage= estiver comentada ou definida como auto, o journald tentará armazenar os logs em disco, mas se o diretório /var/log/journal/ não existir, ele pode operar em modo volátil. Para garantir o armazenamento persistente, certifique-se de que a linha Storage=persistent esteja descomentada no arquivo /etc/systemd/journald.conf e que o diretório /var/log/journal/ exista. Se você alterar o arquivo de configuração, precisará reiniciar o serviço systemd-journald:

sudo systemctl restart systemd-journald

Aviso de Segurança: Armazenar logs em disco pode consumir espaço. É importante monitorar o uso do disco e configurar políticas de rotação ou arquivamento de logs para evitar que o sistema fique sem espaço. O systemd-journald possui opções de configuração para gerenciar o tamanho máximo do journal e o tempo de retenção.

Análise Avançada e Exemplos Práticos

Vamos considerar um cenário comum: um serviço web (Nginx + PHP-FPM) está apresentando lentidão ou erros intermitentes. Como usar o journalctl para diagnosticar?

  1. Verificar logs do Nginx: Comece verificando os logs do Nginx para erros de configuração ou problemas de conexão com o PHP-FPM.
  2. journalctl -u nginx.service --since "1 hour ago"
    
  3. Verificar logs do PHP-FPM: Em seguida, examine os logs do PHP-FPM para identificar erros de script, timeouts ou problemas de memória.
  4. journalctl -u php-fpm.service --since "1 hour ago"
    
  5. Correlacionar eventos: Use a opção -o verbose para obter mais detalhes sobre cada entrada de log, incluindo o timestamp exato e o PID do processo. Isso ajuda a correlacionar eventos entre diferentes serviços.
  6. journalctl -u nginx.service -u php-fpm.service -o verbose --since "1 hour ago"
    
  7. Analisar a inicialização: Se o problema ocorreu após uma reinicialização, você pode ver os logs do boot usando a opção -b:
  8. journalctl -b
    
  9. Filtrar por Kernel messages: Para problemas de hardware ou de baixo nível, os logs do kernel são essenciais.
  10. journalctl -k
    

Esses exemplos demonstram como o journalctl pode ser uma ferramenta inestimável para administradores de sistemas Linux. Para um gerenciamento mais avançado de logs e a exploração de outras ferramentas de linha de comando que podem complementar sua análise, confira nosso artigo sobre dominando o sed no Linux.

Foto de Rafael Minguet Delgado no Pexels.