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):

PrioridadePalavra-chaveDescricao
0emergSistema inutilizavel
1alertAcao imediata necessaria
2critCondicoes criticas
3errCondicoes de erro
4warningCondicoes de aviso
5noticeNormal mas significativo
6infoInformativo
7debugMensagens 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

  1. Verifique que o servico usa saida padrao:
systemctl show myapp.service | grep -i "standard\|log"
  1. 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 -u para filtrar por servico, -p para filtrar por prioridade, e --since/--until para intervalos de tempo
  • Combine filtros para buscas direcionadas: journalctl -u nginx -p err --since "1 hour ago"
  • Use -b para limitar consultas ao boot atual ou sessoes de boot anteriores
  • Habilite armazenamento persistente com mkdir -p /var/log/journal se sua distribuicao usa armazenamento volatil por padrao
  • Configure limites de retencao em /etc/systemd/journald.conf para evitar esgotamento de disco
  • Use -o json para integracao com pipelines de analise de logs como Elasticsearch ou Loki
  • Use journalctl -f em vez de tail -f para 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.