Gestión de logs con Logrotate

Cómo configurar Logrotate para gestionar los registros del sistema y de las aplicaciones.

Cuando se trabaja con VPS o servidores dedicados, el seguimiento de eventos y errores es fundamental para el monitoreo y el diagnóstico. Los archivos de log de gran tamaño generan problemas reales: son difíciles de analizar, consumen CPU y memoria, y pueden provocar fallos en las aplicaciones cuando el disco se llena.

Logrotate resuelve esto archivando automáticamente los logs actuales y creando nuevos archivos para los datos entrantes.

Verificar la instalación

Logrotate viene preinstalado en la mayoría de las distribuciones Linux y se ejecuta automáticamente mediante el planificador cron. Para comprobar la versión:

logrotate --version

Ejemplo de salida:

logrotate 3.21.0
    Default mail command: /usr/bin/mail
    Default compress command: /bin/gzip
    Default uncompress command: /bin/gunzip
    Default compress extension: .gz
    Default state file path: /var/lib/logrotate/status
    ACL support: yes
    SELinux support: yes

La salida muestra qué herramientas utiliza Logrotate para la compresión y las notificaciones, junto con la ruta del archivo de estado que registra el historial de rotaciones.

Estructura de la configuración

Logrotate utiliza una estructura de configuración jerárquica. Los valores globales se definen en /etc/logrotate.conf, mientras que la configuración por aplicación reside en /etc/logrotate.d/.

Ejemplo de /etc/logrotate.conf en Ubuntu:

# rotate log files weekly
weekly

# use the adm group by default
su root adm

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
#dateext

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

Parámetros clave:

  • weekly — los logs se rotan una vez a la semana.
  • create — tras la rotación se crea un nuevo archivo de log vacío.
  • rotate 4 — se conservan cuatro copias archivadas.
  • su root adm — la rotación se ejecuta como usuario root y grupo adm, evitando problemas de permisos con los logs del sistema.
  • compress — compresión de archivos (desactivada por defecto).
  • include /etc/logrotate.d — carga los archivos de configuración por aplicación.

Para la lista completa de directivas:

man logrotate

Configuración por aplicación

Los archivos en /etc/logrotate.d/ siguen la misma estructura que la configuración global, pero se aplican únicamente a logs específicos. Los valores definidos en estos archivos tienen prioridad sobre los globales de /etc/logrotate.conf. Si una directiva no está especificada en la configuración de la aplicación, se utiliza el valor global.

Ejemplo de /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    notifempty
}

Si /etc/logrotate.conf establece rotate 4 y la configuración de una aplicación no define rotate, los logs de esa aplicación seguirán conservando cuatro copias archivadas.

Planificación de la rotación

Por defecto, Logrotate utiliza un enfoque temporal: los logs se rotan según una planificación fija. Intervalos admitidos: hourly, daily, weekly, monthly, yearly.

Logrotate suele ejecutarse una vez al día mediante /etc/cron.daily/logrotate. Para habilitar la rotación horaria, mueve el trabajo a cron.hourly:

sudo mv /etc/cron.daily/logrotate /etc/cron.hourly

Para ejecuciones aún más frecuentes, configura un cron job personalizado.

Rotación por tamaño

Para servicios con volúmenes de log impredecibles, la rotación puede activarse por el tamaño del archivo en lugar de por la planificación.

size — la rotación se produce solo cuando el archivo alcanza el tamaño especificado, independientemente de la planificación:

/var/log/app/*.log {
    size 50M
}

size y las directivas temporales son mutuamente excluyentes: siempre tiene efecto la última opción indicada. Si daily aparece después de size, los logs se rotarán diariamente y el umbral de tamaño se ignorará.

minsize — la rotación sigue la planificación, pero solo si el archivo ha alcanzado el tamaño mínimo:

/var/log/app/*.log {
    daily
    minsize 50M
}

maxsize — la rotación se produce de inmediato en cuanto el archivo supera el límite de tamaño, aunque el momento planificado aún no haya llegado:

/var/log/app/*.log {
    daily
    maxsize 50M
}

Los tamaños pueden especificarse en bytes (por defecto), kilobytes (k), megabytes (M) o gigabytes (G).

Métodos de rotación

Logrotate admite dos métodos principales para gestionar los archivos de log activos.

create (predeterminado) — renombra el archivo activo (app.logapp.log.1) y crea un nuevo archivo vacío con el nombre original. Es el método recomendado y minimiza el riesgo de pérdida de datos de log:

/var/log/app/*.log {
    create
    # create 644 appuser group — opcionalmente, define permisos, propietario y grupo
}

copytruncate — copia el contenido del archivo actual en un archivo de almacenamiento y luego vacía el original. Permite a las aplicaciones seguir escribiendo en el mismo descriptor de archivo. Recomendado solo para aplicaciones legacy que no pueden reabrir los archivos de log tras la rotación:

/var/log/app/*.log {
    copytruncate
}

Nomenclatura de archivos de archivado

Por defecto, los archivos rotados reciben números secuenciales: app.log.1, app.log.2, etc. Para añadir marcas de tiempo, usa dateext:

/var/log/app/*.log {
    dateext
    # por defecto: -%Y%m%d para daily, -%Y%m%d%H para hourly
}

Un log rotado el 25 de junio de 2025 se llamaría app.log-20250625.

Para logs que se rotan varias veces al día, usa un timestamp Unix para garantizar la unicidad:

/var/log/app/*.log {
    dateformat -%Y%m%d-%s
}

La directiva dateyesterday marca el archivo con la fecha del día anterior, lo que resulta útil cuando la rotación ocurre después de medianoche pero los datos pertenecen al día previo.

Compresión

La directiva compress habilita la compresión gzip:

/var/log/app/*.log {
    compress
}

Para usar una herramienta de compresión diferente:

/var/log/app/*.log {
    compress
    compresscmd /usr/bin/bzip2
    uncompresscmd /usr/bin/bunzip2
    compressext .bz2
}

delaycompress evita que el archivo rotado más recientemente se comprima de inmediato, lo que resulta útil cuando una aplicación sigue escribiendo en el archivo antiguo tras la rotación:

/var/log/app/*.log {
    compress
    delaycompress
}

compressoptions establece el nivel de compresión gzip de -1 (rápido, baja compresión) a -9 (lento, compresión máxima):

/var/log/app/*.log {
    compress
    compressoptions -9
}

Resolución de problemas

El archivo de estado de Logrotate muestra cuándo se rotó por última vez cada archivo de log:

sudo cat /var/lib/logrotate/status

Para un análisis detallado, ejecuta Logrotate en modo debug:

sudo logrotate --debug /etc/logrotate.conf

Ayuda

¿Tienes dudas o necesitas ayuda? Escríbenos a través del sistema de tickets — siempre estamos aquí para ayudarte!

¿Necesitas ayuda?Nuestros ingenieros te ayudarán gratuitamente con cualquier pregunta en minutosContáctanos