Quando algo da errado em um servidor Linux, seu primeiro instinto e verificar os logs. Em qualquer distribuicao Linux moderna com systemd, a ferramenta principal para essa tarefa e o journalctl. Ele fornece uma interface unica para consultar logs estruturados de cada servico, do kernel e do processo de boot — tudo indexado e filtravel por tempo, prioridade, unidade de servico e dezenas de outros campos.
Este guia cobre tudo o que voce precisa para usar o journalctl de forma eficaz na administracao diaria e na resolucao de incidentes, desde consultas basicas ate filtragem avancada, configuracao de armazenamento persistente e integracao com ferramentas externas de analise de logs.
Pre-requisitos
Antes de comecar, certifique-se de ter:
- Um sistema Linux com systemd (Ubuntu 20.04+, Debian 11+, RHEL/CentOS 8+, Fedora, Arch ou similar)
- Acesso ao terminal com privilegios sudo
- Familiaridade basica com servicos systemd (
systemctl start,systemctl status)
Entendendo o Journal do systemd
O journal do systemd e um sistema de logging centralizado gerenciado pelo servico systemd-journald. Diferente do syslog tradicional, que escreve texto simples em arquivos em /var/log/, o journal armazena entradas em um formato binario estruturado que inclui metadados com cada linha de log:
- Timestamp com precisao de microssegundos
- ID de boot — qual sessao de boot produziu a entrada
- Nome da unidade — qual servico systemd a gerou
- PID e UID — identificadores de processo e usuario
- Nivel de prioridade — de emergencia (0) a depuracao (7)
- ID da maquina — util em configuracoes multi-servidor
Esta estrutura e o que torna o journalctl tao poderoso: voce pode filtrar por qualquer combinacao desses campos sem escrever padroes grep complexos.
Verifique que o journald esta em execucao no seu sistema:
systemctl status systemd-journald
Consulte quanto espaco em disco o journal usa atualmente:
journalctl --disk-usage
Uso Basico do journalctl
Ver Todos os Logs
journalctl
Isso abre o journal completo em um paginador (normalmente less). Pressione q para sair, / para buscar e G para ir ao final (entradas mais recentes).
Ver as Entradas Mais Recentes
# Mostrar as ultimas 50 linhas
journalctl -n 50
# Mostrar as ultimas 100 linhas sem paginador (saida direta)
journalctl -n 100 --no-pager
Seguir Logs em Tempo Real
journalctl -f
Funciona como tail -f mas para todo o journal. Pressione Ctrl+C para parar. Voce pode combinar -f com qualquer filtro:
# Seguir apenas logs do nginx
journalctl -f -u nginx.service
Ordem Inversa (Mais Recentes Primeiro)
journalctl -r
Filtragem por Tempo
A filtragem por tempo e uma das funcionalidades mais uteis do journalctl para investigacao de incidentes.
Intervalos de Tempo Absolutos
# Logs desde uma data e hora especifica
journalctl --since "2025-12-26 08:00:00"
# Logs entre dois timestamps
journalctl --since "2025-12-25 18:00" --until "2025-12-26 06:00"
# Logs de um dia especifico (dia inteiro)
journalctl --since "2025-12-25" --until "2025-12-26"
Intervalos de Tempo Relativos
# Logs da ultima hora
journalctl --since "1 hour ago"
# Logs dos ultimos 30 minutos
journalctl --since "30 min ago"
# Desde ontem
journalctl --since yesterday
# Apenas hoje
journalctl --since today
Boot Atual vs. Boots Anteriores
# Logs apenas do boot atual
journalctl -b
# Logs do boot anterior
journalctl -b -1
# Logs de dois boots atras
journalctl -b -2
# Listar todos os boots disponiveis
journalctl --list-boots
A saida de --list-boots mostra IDs de boot e timestamps, o que e invaluavel para investigar o que aconteceu antes de uma reinicializacao inesperada.
Filtragem por Unidade de Servico
Aqui e onde o journalctl economiza mais tempo comparado com a analise de logs tradicional.
Servico Individual
# Todos os logs do nginx
journalctl -u nginx.service
# Todos os logs do daemon SSH
journalctl -u sshd.service
# Todos os logs do PostgreSQL
journalctl -u postgresql.service
Multiplos Servicos
# Logs do nginx e PHP-FPM
journalctl -u nginx.service -u php8.1-fpm.service
Combinar Filtros de Servico e Tempo
# Erros do nginx nas ultimas 2 horas
journalctl -u nginx.service --since "2 hours ago" -p err
Servicos de Usuario
# Logs de um servico a nivel de usuario
journalctl --user -u myapp.service
Filtragem por Prioridade
Os niveis de prioridade syslog vao de 0 (emergencia) a 7 (depuracao):
| Prioridade | Palavra-chave | Descricao |
|---|---|---|
| 0 | emerg | Sistema inutilizavel |
| 1 | alert | Acao imediata necessaria |
| 2 | crit | Condicoes criticas |
| 3 | err | Condicoes de erro |
| 4 | warning | Condicoes de aviso |
| 5 | notice | Normal mas significativo |
| 6 | info | Informativo |
| 7 | debug | Mensagens de depuracao |
Filtrar por Prioridade Maxima
# Mostrar erros e superiores (0-3)
journalctl -p err
# Mostrar avisos e superiores (0-4)
journalctl -p warning
# Mostrar criticos e superiores (0-2)
journalctl -p crit
Intervalo de Prioridade
# Mostrar apenas avisos e erros (excluir criticos/emergencia)
journalctl -p warning..err
Combinar com Outros Filtros
# Erros do nginx nas ultimas 24 horas
journalctl -u nginx.service -p err --since "24 hours ago"
Filtragem por Outros Campos
O journalctl pode filtrar por qualquer campo armazenado no journal. Liste os campos disponiveis:
journalctl --fields
Filtros de Campos Comuns
# Logs de um PID especifico
journalctl _PID=1234
# Logs de um usuario especifico
journalctl _UID=1000
# Logs do kernel
journalctl -k
# ou equivalentemente:
journalctl _TRANSPORT=kernel
# Logs de um binario especifico
journalctl /usr/sbin/sshd
# Logs de um hostname especifico (em configuracoes multi-servidor)
journalctl _HOSTNAME=webserver01
Combinar Filtros de Campo
Quando voce especifica multiplos campos diferentes, eles sao combinados com logica AND:
# Logs do UID 1000 E prioridade erro
journalctl _UID=1000 -p err
Quando voce especifica o mesmo campo multiplas vezes, eles sao combinados com logica OR:
# Logs do PID 1234 OU PID 5678
journalctl _PID=1234 _PID=5678
Formatos de Saida
O journalctl suporta varios formatos de saida para diferentes casos de uso:
# Formato curto padrao (similar ao syslog)
journalctl -o short
# Formato curto com timestamps ISO
journalctl -o short-iso
# Saida estruturada completa
journalctl -o verbose
# Formato JSON (um objeto por linha)
journalctl -o json
# JSON formatado para leitura
journalctl -o json-pretty
# Apenas a mensagem (sem metadados)
journalctl -o cat
# Formato de exportacao binario (para journalctl --merge)
journalctl -o export
Saida JSON para Analise de Logs
O formato JSON e particularmente util para enviar a ferramentas de analise:
# Extrair todos os erros do nginx como JSON
journalctl -u nginx.service -p err -o json --no-pager | jq '.'
# Obter campos especificos
journalctl -u sshd.service -o json --no-pager | jq '{timestamp: .__REALTIME_TIMESTAMP, message: .MESSAGE, pid: ._PID}'
Configuracao de Armazenamento Persistente
Por padrao, algumas distribuicoes armazenam os logs do journal apenas na memoria (/run/log/journal/), o que significa que sao perdidos ao reiniciar.
Habilitar Armazenamento Persistente
# Criar o diretorio de armazenamento persistente
sudo mkdir -p /var/log/journal
# Definir a propriedade correta
sudo systemd-tmpfiles --create --prefix /var/log/journal
# Reiniciar o journald
sudo systemctl restart systemd-journald
Configurar Limites de Retencao
Edite /etc/systemd/journald.conf:
[Journal]
# Espaco maximo em disco para arquivos do journal
SystemMaxUse=500M
# Tamanho maximo de arquivos individuais do journal
SystemMaxFileSize=50M
# Tempo maximo para manter entradas
MaxRetentionSec=1month
# Espaco maximo em disco para journal em memoria (volatil)
RuntimeMaxUse=100M
Apos editar, reinicie o servico:
sudo systemctl restart systemd-journald
Limpeza Manual
# Remover entradas anteriores a 2 semanas
sudo journalctl --vacuum-time=2weeks
# Reduzir o journal a um maximo de 500MB
sudo journalctl --vacuum-size=500M
# Manter apenas os 5 arquivos de journal mais recentes
sudo journalctl --vacuum-files=5
Verificar a Configuracao
# Verificar uso de disco atual
journalctl --disk-usage
# Mostrar configuracao do journal
systemd-analyze cat-config systemd/journald.conf
Mensagens do Kernel
Para diagnostico a nivel de kernel, o journalctl substitui o comando dmesg com melhor filtragem:
# Todas as mensagens do kernel
journalctl -k
# Mensagens do kernel do boot atual
journalctl -k -b
# Apenas erros do kernel
journalctl -k -p err
# Mensagens do kernel de um boot anterior
journalctl -k -b -1
Isso e essencial para diagnosticar problemas de hardware, drivers, erros do sistema de arquivos e OOM (falta de memoria).
Exemplos Praticos de Diagnostico
Investigar uma Queda de Servico
# Verificar quando o servico falhou pela ultima vez
systemctl status myapp.service
# Ver as ultimas 200 linhas antes da queda
journalctl -u myapp.service -n 200 --no-pager
# Buscar OOM kills por volta do mesmo horario
journalctl -k --since "1 hour ago" | grep -i "oom\|killed process"
Diagnosticar Falhas de Login SSH
# Todas as mensagens de autenticacao SSH
journalctl -u sshd.service | grep -i "failed\|invalid\|accepted"
# Tentativas SSH falhas nas ultimas 24 horas
journalctl -u sshd.service --since "24 hours ago" -p warning
Monitorar Problemas de Disco e Sistema de Arquivos
# Erros do sistema de arquivos do kernel
journalctl -k | grep -i "ext4\|xfs\|btrfs\|i/o error\|read-only"
# Mensagens relacionadas a disco
journalctl -k | grep -i "sd[a-z]\|nvme\|ata"
Verificar Problemas de Boot
# Log completo do ultimo boot com falha
journalctl -b -1 -p err
# Listar todos os boots para encontrar o problematico
journalctl --list-boots
# Mostrar apenas servicos que falharam ao iniciar durante o boot
journalctl -b -p err | grep "Failed to start"
Integracao com Ferramentas Externas
Encaminhar para rsyslog
Se voce precisa de arquivos de log tradicionais junto com o journal, configure o rsyslog para ler do journal. Em /etc/rsyslog.conf:
module(load="imjournal")
Exportar para Elasticsearch/Loki
# Exportar como JSON para ingestao
journalctl -o json --since "1 hour ago" --no-pager > /tmp/journal-export.json
# Enviar para um endpoint remoto
journalctl -f -o json | curl -X POST -H "Content-Type: application/json" -d @- http://logserver:9200/journal/_bulk
Usar com systemd-journal-remote
Para logging centralizado em multiplos servidores, o systemd fornece systemd-journal-remote:
# Instalar no servidor central
sudo apt install systemd-journal-remote
# Habilitar o receptor
sudo systemctl enable --now systemd-journal-remote.socket
Solucao de Problemas
Arquivos do Journal Corrompidos
# Verificar integridade do journal
journalctl --verify
# Se corrompidos, rotacionar e comecar de novo
sudo journalctl --rotate
sudo journalctl --vacuum-time=1s
Sem Logs de um Servico Especifico
- Verifique que o servico usa saida padrao:
systemctl show myapp.service | grep -i "standard\|log"
- Certifique-se de que o arquivo de unidade redireciona a saida para o journal:
[Service]
StandardOutput=journal
StandardError=journal
journalctl esta Lento com Journals Grandes
# Use --since para limitar o intervalo de busca
journalctl --since "1 hour ago" -u myapp.service
# Reduza o tamanho do journal
sudo journalctl --vacuum-size=200M
Resumo
journalctl e a ferramenta padrao para consultar logs em sistemas Linux baseados em systemd. Pontos principais:
- Use
-upara filtrar por servico,-ppara filtrar por prioridade, e--since/--untilpara intervalos de tempo - Combine filtros para buscas direcionadas:
journalctl -u nginx -p err --since "1 hour ago" - Use
-bpara limitar consultas ao boot atual ou sessoes de boot anteriores - Habilite armazenamento persistente com
mkdir -p /var/log/journalse sua distribuicao usa armazenamento volatil por padrao - Configure limites de retencao em
/etc/systemd/journald.confpara evitar esgotamento de disco - Use
-o jsonpara integracao com pipelines de analise de logs como Elasticsearch ou Loki - Use
journalctl -fem vez detail -fpara monitoramento em tempo real com filtragem
Para topicos relacionados, consulte nossos guias sobre Logrotate: Gerenciar Arquivos de Log no Linux e Configuracao do Elasticsearch para Analise de Logs.