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ávelalert(1): Ação necessária imediatamentecrit(2): Condições críticaserr(3): Erroswarning(4): Avisosnotice(5): Notificações normais, mas significativasinfo(6): Mensagens informativasdebug(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?
- Verificar logs do Nginx: Comece verificando os logs do Nginx para erros de configuração ou problemas de conexão com o PHP-FPM.
- Verificar logs do PHP-FPM: Em seguida, examine os logs do PHP-FPM para identificar erros de script, timeouts ou problemas de memória.
- Correlacionar eventos: Use a opção
-o verbosepara 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. - 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: - Filtrar por Kernel messages: Para problemas de hardware ou de baixo nível, os logs do kernel são essenciais.
journalctl -u nginx.service --since "1 hour ago"
journalctl -u php-fpm.service --since "1 hour ago"
journalctl -u nginx.service -u php-fpm.service -o verbose --since "1 hour ago"
journalctl -b
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.