Skip to content
BotServBotServ
DockerLogsLog-Rotationjson-filelogrotate

Configurar rotación de logs en Docker

Rotar y limitar logs de contenedores Docker. json-file, logrotate, Promtail y configuración.

S

schutzgeist

3 min read
Configurar rotación de logs en Docker

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 local y 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 local en lugar de json-file si 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

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

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.

Volver al blog
Share:

Entradas relacionadas