Configurar retenção e compactação de logs de containers Docker com journald + logrotate + rsyslog em VPS com pouco disco
Linux & Sistemas · Por Kevin Marcondes · Publicado em · 8 min de leitura
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 casoVeja também
- tutorial: configurar mTLS entre Traefik e serviços em Docker Compose usando smallstep CA e certificados automáticos — passo a passo
- Tutorial: integrar Sentry ao pipeline de deploy com GitHub Actions para upload automático de source maps e criação de issues (PHP e JavaScript) — passo a passo
- tutorial: configurar GitHub Actions para testes de integração com PostgreSQL em containers efêmeros e rollback automático de migrações — guia prático
- Configurar BuildKit garbage collection e systemd timers para limpeza automática de imagens e volumes Docker em VPS: tutorial prático