Configurar la rotación de logs en Docker
Qué cubre este artículo
- Por qué hay que limitar los logs de los contenedores.
- Cómo Docker almacena los logs por defecto.
- Cómo restringir el tamaño y número de logs.
- Alternativas como
localy servicios de logs externos. - Recomendaciones para entornos de producción.
Introducción: Configurar la rotación de logs en Docker
Los contenedores de Docker escriben logs en stdout y stderr por defecto. Si no se configura nada más, estos logs crecen sin límite y terminan llenando el disco duro. Especialmente en aplicaciones en crecimiento, chatbots o sistemas con muchas solicitudes, los logs pueden alcanzar fácilmente varios gigabytes. La rotación de logs se encarga de que los registros antiguos se eliminen o se archiven mientras los logs actuales siguen disponibles.
Este artículo explica cómo implementar la rotación de logs en Docker de forma correcta.
Conceptos clave
- Log-Driver: Controlador que almacena o reenvía logs.
- json-file: Driver estándar que guarda logs en formato JSON.
- local: Controlador que rota logs localmente.
- Log-Rotation: Archivo o eliminación regular de logs antiguos.
- Log-Forwarder: Servicio que envía logs a sistemas externos.
- Retention: Período de retención.
- max-size: Tamaño máximo de un archivo de log.
- max-file: Número máximo de archivos rotados.
Comportamiento por defecto
Docker almacena logs con el driver json-file. Cada línea se escribe en un archivo JSON que crece indefinidamente sin límites:
/var/lib/docker/containers/<id>/<id>-json.log
Configurar el log-driver por contenedor
En compose.yaml:
services:
app:
image: mein-app
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Esto limita cada archivo de log a 10 MB y mantiene tres archivos.
Configuración global
En /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Luego reinicia Docker:
sudo systemctl restart docker
Los contenedores existentes deben recrearse para que las nuevas opciones tengan efecto.
Driver local
El driver local rota automáticamente y consume menos recursos que json-file:
{
"log-driver": "local",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Verificar logs
docker logs <container>
docker logs --tail 100 <container>
docker logs --since 1h <container>
Revisar el tamaño de los logs
sudo du -sh /var/lib/docker/containers/*
O para un contenedor específico:
sudo ls -lh /var/lib/docker/containers/<id>/<id>-json.log
Limpiar logs
Detén el contenedor:
docker stop <container>
Vacía el archivo de log:
sudo sh -c 'truncate -s 0 /var/lib/docker/containers/<id>/<id>-json.log'
Inicia el contenedor:
docker start <container>
Logs externos con syslog
services:
app:
image: mein-app
logging:
driver: "syslog"
options:
syslog-address: "udp://localhost:514"
Enviar logs a Loki o Splunk
services:
app:
image: mein-app
logging:
driver: "loki"
options:
loki-url: "http://localhost:3100/loki/api/v1/push"
Logrotate para logs de contenedores
Para logs del host o logs montados con bind-mount, puedes usar logrotate:
/var/log/containers/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 root adm
sharedscripts
}
Recomendaciones
- Siempre establece límites de tamaño y número de archivos.
- Usa
localen lugar dejson-filesi no necesitas procesamiento JSON. - Para producción utiliza logs externos como Loki o Splunk.
- Documenta la política de retención.
- Verifica regularmente que la rotación funciona correctamente.
- Nunca registres secretos en los logs.
Errores comunes
- Sin límite de logs: El disco se llena.
- Cambio global sin recrear contenedores: Los contenedores existentes conservan el driver antiguo.
- Truncar mientras está en ejecución: Pérdida de datos.
- Log-forwarder inaccesible: El contenedor no arranca.
- Retención muy corta: Los errores no se pueden investigar.
- Permisos incorrectos: Los logs no pueden eliminarse.
Enlaces y referencias
- BotServ.de Docker Logs
- BotServ.de Docker Monitoring
- BotServ.de Docker Volumes
- BotServ.de Docker Backup
FAQ: Rotación de logs en Docker
¿Se eliminan los logs automáticamente? No, sin configuración crecen sin límite.
¿Cuál es el mejor log-driver?
Para configuraciones locales local o json-file con max-size. Para recopilación centralizada Loki o Splunk.
¿Cómo afectan las configuraciones globales? Solo aplican a contenedores creados después del cambio.
¿Con qué frecuencia se rotan los logs?
Cuando se alcanza max-size, no según un horario.
¿Debo comprimir los logs? Sí, si los guardas durante mucho tiempo, para ahorrar espacio.
Referencias y lecturas adicionales
- Docker Logging: https://docs.docker.com/config/containers/logging/configure/
- JSON File Log Driver: https://docs.docker.com/config/containers/logging/json-file/
- Local Log Driver: https://docs.docker.com/config/containers/logging/local/
- Loki: https://grafana.com/loki/
Resumen: Configurar la rotación de logs en Docker
La rotación de logs en Docker evita que los logs de los contenedores crezcan sin control y llenen el disco duro. El driver json-file o local con max-size y max-file es la solución más simple para configuraciones locales. Para gestión centralizada, los servicios de logs externos son la mejor opción. Si estableces límites en los logs, los verificas regularmente y fijas una política de retención clara, mantendrás bajo control el uso de almacenamiento y tendrás acceso a los registros relevantes cuando los necesites para solucionar problemas.


