Configurar retención y compresión de logs de contenedores Docker con journald + logrotate + rsyslog en VPS con poco disco
Linux & Sistemas · Por Kevin Marcondes · Publicado el · 9 min de lectura
Este tutorial muestra cómo configurar retención y compresión de logs de contenedores Docker usando journald, rsyslog y logrotate en VPS con poco espacio en disco. Limitarás el uso de disco, comprimirás archivos antiguos por contenedor y mantendrás trazabilidad sin depender de json-file, con pasos testables y reversibles.
Requisitos previos y objetivos del setup
La idea es usar journald como driver de logs de Docker, extraer eventos vía rsyslog y rotar/comprimir con logrotate. Así controlas el consumo de disco sin perder el historial reciente.
Necesitas un servidor Linux con systemd (por ejemplo Debian/Ubuntu), acceso root, Docker instalado y los paquetes rsyslog y logrotate. Prueba todo fuera de producción primero. Para una visión general de estrategias, consulta cómo reducir el uso de disco por logs de contenedores Docker (/es/reducir-uso-disco-logs-docker-vps).
- Linux con systemd (journald activo)
- Docker Engine instalado
- rsyslog y logrotate instalados
- Acceso root o 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
¿Cuánto espacio ocupan los logs ahora?
Antes de cambiar nada, mide el uso actual. Si todavía usas json-file en Docker, los .log están en /var/lib/docker/containers. journald muestra el total actual con 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 /
¿Qué política de retención y compresión usar en la VPS?
Los límites vienen de dos lugares: journald (archivos .journal binarios) y los archivos de texto generados por rsyslog. journald debe tener un tope de uso en disco; los archivos de texto se rotan y comprimen con logrotate.
La tabla abajo ayuda a decidir dónde aplicar cada ajuste.
| Componente | Qué controla | Dónde configurar |
|---|---|---|
| systemd-journald | Tamaño máximo y compresión de los .journal | /etc/systemd/journald.conf |
| Docker (logging driver) | A dónde escribe el contenedor los logs | /etc/docker/daemon.json |
| rsyslog (imjournal) | Lectura del journald y escritura en archivo | /etc/rsyslog.d/*.conf |
| logrotate | Rotación, compresión y retención de los .log en texto | /etc/logrotate.d/*.conf |
Configurar Docker para usar journald con una etiqueta predecible
Configura Docker para el driver journald y define un prefijo de tag. La tag será el identificador del programa (SYSLOG_IDENTIFIER) en journald y rsyslog. Usaremos el prefijo ctn- para filtrar solo mensajes de contenedores.
Atención: el cambio aplica a contenedores nuevos. Los contenedores existentes mantienen el driver actual hasta que sean recreados.
- La tag incluye el nombre del contenedor: ctn-{{.Name}}
- Sin barras en la tag, para poder usarla luego como nombre de archivo
- Recrea los contenedores para aplicar el cambio
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 la retención de journald (límite de espacio y compresión)
Define límites de uso de journald para que no consuma todo el disco. Storage=persistent asegura que los logs se guarden en disco; SystemMaxUse/RuntimeMaxUse imponen techos. Compress=yes activa la compresión de los journals antiguos.
Elige valores proporcionales al espacio disponible. No copies los números de ejemplo sin evaluar tu caso. Consulta también guías de políticas de journald.
- Storage=persistent crea/usa /var/log/journal
- SystemMaxUse limita el total persistente
- RuntimeMaxUse limita /run/log/journal (volátil)
- Compress=yes habilita compresión 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
Activar rsyslog para leer del journal y escribir archivos por contenedor
rsyslog puede leer eventos desde journald (imjournal) y escribirlos en archivos de texto. Como definimos la tag ctn-{{.Name}}, filtramos solo mensajes de esos contenedores y creamos un archivo por contenedor en /var/log/containers.
Permisos: asegúrate de que solo usuarios autorizados puedan leer /var/log/containers. Los logs pueden contener datos sensibles.
- Cargar imjournal
- Template de archivo por contenedor
- Filtro por prefijo ctn-
- Crear directorio /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
Rotación y compresión con logrotate para los archivos de rsyslog
Usa logrotate para girar y comprimir los archivos en /var/log/containers. copytruncate permite rotarlos sin reiniciar rsyslog; ajusta periodicidad y retención según tu política.
Puedes combinar rotación por tamaño y diaria. Forzar rotación en producción puede descartar buffers; procede con cautela.
- Compresión con gzip (compress + delaycompress)
- copytruncate evita recargar rsyslog
- rotate N define cuánto mantener
- size X controla rotación por tamaño
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
Cómo confirmar que funcionó y problemas comunes
Valida cada capa: journald recibiendo de los contenedores, rsyslog escribiendo archivos y logrotate girando/comprimiendo. Genera logs de prueba y observa los efectos. Si no aparece algo, verifica que el contenedor fue recreado con el driver correcto.
Logs aún en json-file: los contenedores antiguos conservan el driver anterior. Recrea con Docker Compose o detén/levanta con las mismas opciones.
Archivos que crecen demasiado: reduce SystemMaxUse/RuntimeMaxUse en journald y/o disminuye size/rotate en logrotate. Combina con limpieza de imágenes/volúmenes: consulta el tutorial de BuildKit GC y systemd timers (/es/buildkit-gc-systemd-timers-docker-vps).
Permisos de lectura: restringe el grupo de los archivos en /var/log/containers y evalúa requisitos legales de retención. Para políticas de servidores, revisa la guía de auditd y rotación para LGPD (/es/auditd-rotacion-retencion-logs-lgpd).
Conflicto con centralización externa: si envías logs a un agregador, mantiene rsyslog escribiendo localmente solo lo necesario, o prescinde de los archivos y usa solo journald con límites bien definidos.
- Verifica journalctl por la tag ctn-
- Confirma creación/rotación en /var/log/containers
- Forzar una rotación controlada para pruebas
# 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
Preguntas frecuentes
¿Necesito reiniciar todos los contenedores para usar journald?
Sí. La configuración del driver por defecto solo aplica a contenedores nuevos. Los existentes mantienen el driver antiguo hasta que sean recreados. Usa docker compose up -d --force-recreate o detén y levanta nuevamente.
¿journald comprime los logs por sí mismo?
Sí. Cuando Compress=yes está habilitado en journald.conf, los archivos de journal antiguos se comprimen automáticamente. Aun así, define límites como SystemMaxUse para contener el uso total en disco.
¿Por qué usar rsyslog y logrotate si journald ya rota?
journald rota y comprime sus propios archivos binarios. rsyslog permite generar archivos de texto por contenedor, útiles para auditoría e integraciones. logrotate controla la retención y compresión de esos archivos de texto.
¿Puedo mantener solo journald sin archivos de texto?
Sí. Define Storage=persistent, límites de espacio y usa journalctl para consultas. El flujo rsyslog+logrotate es opcional y útil cuando necesitas archivos legibles por herramientas externas.
¿Esto afecta al rendimiento de los contenedores?
En general, el driver journald tiene baja sobrecarga. El impacto depende del volumen de logs y del I/O de la VPS. Si hay picos, ajusta buffers y límites de rotación y evita logs muy verbosos en producción.
¿Cómo definir valores correctos de SystemMaxUse y rotate/size?
Usa la capacidad de disco y el volumen medio de logs como guía. Empieza con límites conservadores, monitoriza el uso varios días (journalctl --disk-usage y du en directorios) y ajusta progresivamente.
¿Quieres aplicar esta política de logs con seguridad?
Si necesitas adaptar retención, compresión y rotación de logs a tu entorno de contenedores, hablemos sobre tu escenario y las restricciones de disco.
Hablar sobre tu casoVer también
- Tutorial: configurar mTLS entre Traefik y servicios en Docker Compose usando smallstep CA y certificados automáticos — paso a paso
- Tutorial: integrar Sentry en el pipeline de deploy con GitHub Actions para subir source maps automáticamente y generar issues (PHP y JavaScript) — paso a paso
- Tutorial: configurar GitHub Actions para tests de integración con PostgreSQL en contenedores efímeros y rollback automático de migrations — guía práctica
- Configurar BuildKit garbage collection y systemd timers para limpieza automática de imágenes y volúmenes Docker en VPS: tutorial práctico