Configurar retenção e compactação de logs de containers Docker com journald + logrotate + rsyslog em VPS com pouco disco

Linux & Sistemas · Por · Publicado em · 8 min de leitura

troncos cortados empilhados, mostrando secções circulares e textura da madeira
Metáfora visual para logs do sistema e retenção de dados Foto: Birgit Böllinger / Pexels

Este tutorial ensina a configurar retenção e compactação de logs de containers Docker com journald + logrotate + rsyslog em VPS com pouco disco. Você vai limitar o uso de disco, comprimir arquivos antigos por container e manter rastreabilidade sem depender do json-file, com passos testáveis e reversíveis.

Pré‑requisitos e objetivos do setup

A ideia é usar o journald como driver de logs do Docker, extrair eventos via rsyslog e rotacionar/comprimir com logrotate. Assim você controla consumo de disco sem perder histórico recente.

Você precisa de um servidor Linux com systemd (ex.: Debian/Ubuntu), acesso root, Docker instalado e os pacotes rsyslog e logrotate. Testes devem ser feitos fora de produção primeiro. Para visão geral de estratégias, veja como reduzir uso de disco por logs de containers Docker.

  • Linux com systemd (journald ativo)
  • Docker Engine instalado
  • rsyslog e logrotate instalados
  • Acesso root ou sudo
# Instalar rsyslog e logrotate (Debian/Ubuntu)
sudo apt-get update && sudo apt-get install -y rsyslog logrotate

# Garantir que rsyslog e journald estão ativos
systemctl is-active rsyslog systemd-journald

Quanto espaço os logs estão ocupando agora?

Antes de mudar algo, meça o uso atual. Se você já usa json-file no Docker, os .log ficam em /var/lib/docker/containers. O journald mostra o total atual com journalctl --disk-usage.

# Se o Docker ainda usa json-file (padrão), estime o espaço atual
sudo du -sh /var/lib/docker/containers/*/*-json.log 2>/dev/null | sort -h | tail -n 20

# Uso de disco do journald (persistente e runtime somados)
journalctl --disk-usage

# Espaço livre no filesystem de logs
df -h /var/log /var/lib/docker /

Qual política de retenção e compressão usar na VPS?

Os limites vêm de dois lugares: o journald (binários .journal) e os arquivos em texto gerados pelo rsyslog. O journald deve ter um teto de uso em disco. Já os arquivos em texto são rotacionados pelo logrotate com compressão.

A tabela abaixo ajuda a decidir onde cada ajuste é feito.

Componente O que controla Onde configurar
systemd-journald Tamanho máximo e compressão dos .journal /etc/systemd/journald.conf
Docker (logging driver) Para onde o container escreve logs /etc/docker/daemon.json
rsyslog (imjournal) Leitura do journald e escrita em arquivo /etc/rsyslog.d/*.conf
logrotate Rotação, compressão e retenção dos .log em texto /etc/logrotate.d/*.conf

Definir o Docker para usar journald com tag previsível

Configure o Docker para o driver journald e defina um prefixo de tag. A tag vira o identificador do programa (SYSLOG_IDENTIFIER) no journald e no rsyslog. Usaremos o prefixo ctn- para filtrar apenas mensagens de containers.

Atenção: a mudança vale para novos containers. Os existentes mantêm o driver atual até serem recriados.

  • Tag inclui o nome do container: ctn-{{.Name}}
  • Sem barras na tag, para virar nome de arquivo depois
  • Recrie containers para aplicar a mudança
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json >/dev/null <<'JSON'
{
  "log-driver": "journald",
  "log-opts": {
    "tag": "ctn-{{.Name}}"
  }
}
JSON

# Reinicie o Docker (impacta somente criação/stop/start de containers)
sudo systemctl restart docker

# Exemplo de (re)criação para aplicar o driver:
# docker compose up -d --force-recreate

Ajustar retenção do journald (limite de espaço e compressão)

Defina limites de uso do journald para não consumir todo o disco. O Storage=persistent garante logs no disco; SystemMaxUse/RuntimeMaxUse impõem tetos. Compress=yes comprime arquivos antigos do journal.

Escolha valores proporcionais ao disco disponível. Não copie os números abaixo sem avaliar seu caso. Veja também o guia de políticas do journald.

  • Storage=persistent cria/usa /var/log/journal
  • SystemMaxUse limita o total persistente
  • RuntimeMaxUse limita /run/log/journal (volátil)
  • Compress=yes habilita compressão nativa
sudo sed -i.bak 's/^#\(Storage=\).*/\1persistent/' /etc/systemd/journald.conf
sudo sed -i 's/^#\(Compress=\).*/\1yes/' /etc/systemd/journald.conf

# Acrescente (ou ajuste) limites; edite conforme sua VPS
sudo tee -a /etc/systemd/journald.conf >/dev/null <<'CONF'
SystemMaxUse=500M
RuntimeMaxUse=100M
CONF

sudo systemctl restart systemd-journald
journalctl --disk-usage

Ativar rsyslog para ler do journal e gravar arquivos por container

O rsyslog pode ler eventos do journald (imjournal) e gravar em arquivos de texto. Como definimos a tag ctn-{{.Name}}, filtramos apenas mensagens desses containers e criamos um arquivo por container em /var/log/containers.

Permissões: garanta que apenas usuários autorizados leiam /var/log/containers. Logs podem conter dados sensíveis.

  • Carregar imjournal
  • Template de arquivo por container
  • Filtro por prefixo ctn-
  • Criar diretório /var/log/containers
# Diretório para os arquivos em texto
sudo install -d -m 0750 -o root -g adm /var/log/containers

# Configuração do rsyslog
sudo tee /etc/rsyslog.d/30-containers.conf >/dev/null <<'RSYS'
module(load="imjournal" StateFile="imjournal.state")

# Template: um arquivo por container usando a tag (programname)
template(name="CtnLog" type="string" string="/var/log/containers/%programname%.log")

# Filtra somente mensagens com tag iniciando em ctn-
if $programname startswith "ctn-" then {
  action(type="omfile" DynaFile="CtnLog" FileCreateMode="0640" DirCreateMode="0750")
  stop
}
RSYS

sudo systemctl restart rsyslog
# Gere um log e confira a criação do arquivo em /var/log/containers

Rotação e compressão com logrotate para os arquivos do rsyslog

Use o logrotate para girar e comprimir arquivos de /var/log/containers. O copytruncate permite rotacionar sem reiniciar o rsyslog; ajuste periodicidade e quantidade conforme sua política.

Você pode combinar rotação por tamanho e diária. Forçar rotação em produção pode descartar buffers; faça com cautela.

  • Compressão com gzip (compress + delaycompress)
  • copytruncate evita reload do rsyslog
  • rotate N define quanto manter
  • size X controla rotação por tamanho
sudo tee /etc/logrotate.d/containers >/dev/null <<'LR'
/var/log/containers/*.log {
  daily            # ou weekly
  rotate 7         # ajuste retenção
  size 50M         # gira ao atingir ~50MB
  compress
  delaycompress
  missingok
  notifempty
  copytruncate
  dateext
  dateformat -%Y%m%d
}
LR

# Teste em modo debug (não executa ações destrutivas)
sudo logrotate -d /etc/logrotate.d/containers

Como confirmar que funcionou e quais problemas comuns?

Valide cada camada: journald recebendo dos containers, rsyslog escrevendo arquivos e o logrotate girando/comprimindo. Gere logs propositais e observe os efeitos. Se algo não aparecer, veja se o container foi recriado com o driver correto.

Logs ainda em json-file: containers antigos mantêm o driver anterior. Recrie com Docker Compose ou pare/inicie com as mesmas opções.

Arquivos crescendo demais: reduza SystemMaxUse/RuntimeMaxUse no journald e/ou diminua size/rotate no logrotate. Combine com limpeza de imagens/volumes: veja o tutorial de BuildKit GC e systemd timers.

Permissões de leitura: restrinja o grupo dos arquivos de /var/log/containers e avalie requisitos legais de retenção. Para políticas em servidores, confira o guia de auditd e rotação LGPD.

Conflito com centralização externa: se você envia logs para um agregador, mantenha o rsyslog escrevendo localmente apenas o necessário, ou pule a etapa de arquivos e dependa só do journald com limites bem definidos.

  • Verifique journalctl por tag ctn-
  • Confira criação/rotação em /var/log/containers
  • Force uma rotação controlada para teste
# Suba um container de teste e gere logs
docker run --rm --name demo-log alpine sh -c 'for i in $(seq 1 2000); do echo "linha $i"; done'

# 1) journald por tag (SYSLOG_IDENTIFIER = ctn-demo-log)
journalctl -t ctn-demo-log -n 20 --no-pager

# 2) rsyslog escreveu arquivo por container
ls -lh /var/log/containers/

grep -n "linha" /var/log/containers/ctn-demo-log.log | head

# 3) Forçar rotação (apenas para teste)
sudo logrotate -vf /etc/logrotate.d/containers
ls -lh /var/log/containers/ | grep demo-log

Perguntas frequentes

Preciso reiniciar todos os containers para usar journald?

Sim, a configuração do driver padrão só vale para novos containers. Os existentes mantêm o driver antigo até serem recriados. Use docker compose up -d --force-recreate ou pare e suba novamente.

O journald comprime os logs por conta própria?

Sim, quando Compress=yes está habilitado no journald.conf, arquivos de journal antigos são comprimidos automaticamente. Ainda assim, defina limites como SystemMaxUse para conter o uso total de disco.

Por que usar rsyslog e logrotate se o journald já rota?

O journald roda e comprime seus próprios arquivos binários. O rsyslog permite gerar arquivos de texto por container, úteis para auditoria e integrações. O logrotate controla retenção e compressão desses arquivos em texto.

Posso manter apenas o journald sem arquivos de texto?

Pode. Defina Storage=persistent, limites de espaço e use o journalctl para consulta. O fluxo com rsyslog+logrotate é opcional e útil quando você precisa de arquivos legíveis por ferramentas externas.

Isso afeta performance dos containers?

Em geral, o driver journald tem sobrecarga baixa. O impacto depende do volume de logs e do I/O da VPS. Se houver picos, ajuste buffers e limites de rotação e evite logs verbosos em produção.

Como definir valores corretos de SystemMaxUse e rotate/size?

Use a capacidade de disco e o volume médio de logs como guia. Comece com limites conservadores, monitore uso por alguns dias (journalctl --disk-usage e du no diretório) e ajuste progressivamente.

Quer aplicar esta política de logs com segurança?

Se você precisa adaptar retenção, compressão e rotação de logs ao seu ambiente de containers, vamos conversar sobre seu cenário e restrições de disco.

Falar sobre seu caso

Veja também