Logrotate es una herramienta fundamental en cualquier sistema Linux que automatiza la gestión de archivos de log. Sin una adecuada rotación, los logs pueden llenar el disco, degradar el rendimiento y dificultar el diagnóstico de problemas.

En este post, explicaré cómo configurar y usar logrotate para mantener tus logs bajo control, con ejemplos prácticos para NGINX, Docker, aplicaciones personalizadas y más.

Requisitos

  • Sistema Linux. Durante el post usaré Debian, si usas otra distribución, adapta los comandos según tu gestor de paquetes.
  • Acceso como root o mediante sudo/doas. En mi caso lo haré como root (usando su).
  • (Opcional) Servicios generando logs como NGINX, Docker, Apache, etc.

Consideraciones a tener en cuenta

  1. Logrotate se ejecuta normalmente una vez al día. En sistemas modernos con systemd, esto se gestiona mediante un timer (logrotate.timer), aunque si tu sistema no tiene systemd, es posible que utilice cron y se gestione en el fichero /etc/cron.daily/logrotate. De hecho, si revisamos el contenido del script de cron, veremos que si detecta que systemd está presente, no hace nada (exit 0):

    cat /etc/cron.daily/logrotate
    

    Logrotate Cron Script - Contenido del script de cron

    Por su parte, el timer de systemd se ubica en la ruta /usr/lib/systemd/system/logrotate.timer y podemos ver su configuración con:

    cat /usr/lib/systemd/system/logrotate.timer
    
    [Unit]
    Description=Daily rotation of log files
    Documentation=man:logrotate(8) man:logrotate.conf(5)
    
    [Timer]
    OnCalendar=daily
    RandomizedDelaySec=1h
    Persistent=true
    
    [Install]
    WantedBy=timers.target
    
  2. Es fundamental testear las configuraciones antes de aplicarlas usando el modo debug (-d).

  3. Ten cuidado con los permisos de los archivos rotados.

¿Qué es logrotate?

Logrotate es una utilidad del sistema diseñada para simplificar la administración de archivos de log. Permite la rotación automática, compresión, eliminación y envío por correo de logs, como si esto fuera poco, también podemos ejecutar comandos y scripts personalizados antes y después de la rotación.

¿Cómo funciona?

  1. Se ejecuta de forma recurrente mediante timers de systemd (logrotate.timer) o cron jobs (/etc/cron.daily/logrotate).
  2. Lee las configuraciones de /etc/logrotate.conf y /etc/logrotate.d/.
  3. Aplica las reglas definidas para cada archivo o conjunto de archivos.
  4. Ejecuta comandos y scripts pre y post-rotación si están configurados.
  5. Registra el estado en /var/lib/logrotate/status.

Ventajas:

  • Ahorro de espacio: Comprime logs antiguos y elimina los muy antiguos (según lo configuremos)
  • Prevención: Evita que el disco se llene por logs descontrolados
  • Automatización: Todo ocurre sin intervención manual

Instalación

Logrotate viene preinstalado en la mayoría de distribuciones Linux actuales, pero podemos verificar su existencia y versión con:

su -

# Es posible que falle si no se ejecuta como root
logrotate --version

También puedes verificar su ubicación:

which logrotate

Salida esperada:

Logrotate Version - Versión instalada

Si por alguna razón no lo tienes instalado:

apt update

apt install logrotate

Verifica que el timer o cron esté activo:

# En sistemas con systemd
systemctl status logrotate.timer

# O verifica el script de cron
ls -l /etc/cron.daily/logrotate

Logrotate - Estado de instalación

Estructura de archivos

Logrotate utiliza una estructura de configuración jerárquica:

Archivos principales:

  • /etc/logrotate.conf - Configuración global del sistema

  • /etc/logrotate.d/ - Directorio con configuraciones específicas por servicio

  • /var/lib/logrotate/status - Archivo de estado que registra cuándo se rotó cada log por última vez:

    Logrotate Status File - Archivo de estado

Directorios:

/etc/
├── logrotate.conf          # Configuración global
├── logrotate.d/            # Configuraciones por servicio
│   ├── alternatives
│   ├── apt
│   ├── dpkg
│   ├── nginx               # Configuración de NGINX
│   ├── rsyslog
│   └── ...
└── cron.daily/
    └── logrotate           # Script que ejecuta logrotate diariamente en caso de usar cron en lugar de timers de systemd

/var/lib/logrotate/
└── status                  # Estado de las rotaciones

Orden de precedencia: Las configuraciones de servicios en /etc/logrotate.d/ tienen prioridad sobre las directivas globales en /etc/logrotate.conf.

Directivas de configuración

Logrotate tiene una gran cantidad de directivas para personalizar su comportamiento que pueden ser consultadas en el manual (man logrotate). Aquí te listo las más comunes, pero no olvides revisar el manual para así aprovechar todo su potencial:

Directiva Descripción
daily, weekly, monthly, yearly Frecuencia de rotación
rotate N Número de archivos rotados a mantener
compress Comprimir logs antiguos
delaycompress No comprimir el primer log rotado, útil para consultarlo fácilmente
size N Rotar cuando el archivo alcance el tamaño (ej: size 100M)
maxsize N Rotar si supera el tamaño, sin importar el tiempo
missingok No generar error si el log no existe
notifempty No rotar si el archivo está vacío
create mode owner group Crear nuevo log con permisos específicos
copytruncate Primero hace una copia del log con un nuevo nombre y luego, vacía el original para evitar que el proceso que escribe en el log pierda la referencia al archivo original
dateext Agregar fecha en lugar de número al nombre del log rotado
dateformat Formato de la fecha (por defecto: -%Y%m%d)
maxage N Eliminar logs más antiguos de N días
sharedscripts Ejecuta los comandos y scripts pre/postrotate una sola vez en lugar de una por cada archivo
prerotate ... endscript Script a ejecutar antes de rotar los logs
postrotate ... endscript Script a ejecutar después de rotar los logs

La forma recomendada de configurar logrotate es mediante archivos en /etc/logrotate.d/. Así será más sencillo de gestionar.

Ejemplos de configuración

Supongamos que tienes una aplicación que genera logs en /var/log/miapp/, y quieres rotarlos diariamente, manteniendo 7 días de logs comprimidos pero sin comprimir el del día anterior para poderlo consultar rápidamente.

Comenzarías creando un archivo de configuración para que logrotate gestione esos logs:

nano -cl /etc/logrotate.d/miapp

Contenido:

/var/log/miapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    notifempty
    missingok
    create 0640 juanje admins
    sharedscripts
    prerotate
        # Comandos antes de la rotación
    endscript
    postrotate
        # Comandos después de la rotación
    endscript
}
  • /var/log/miapp/*.log: Aplica a todos los archivos .log del directorio /var/log/miapp/
  • daily: Rotar cada día
  • rotate 7: Mantener 7 rotaciones de logs
  • compress: Comprimir logs antiguos
  • delaycompress: No comprimir el log del día anterior (útil si alguien necesita consultarlo)
  • notifempty: No rotar archivos vacíos
  • missingok: No fallar si el archivo no existe
  • create 0640 juanje admins: Crear nuevo archivo con permisos 0640, propietario juanje y grupo admins
  • sharedscripts: Ejecutar scripts una sola vez por rotación en lugar de una vez por cada archivo
  • prerotate y postrotate: Espacios para comandos o scripts personalizados antes y después de la rotación

Las rotaciones generarían archivos como:

/var/log/miapp/
├── miapp.log       # Log actual
├── miapp.log.1     # Log del día anterior (sin comprimir)
├── miapp.log.2.gz  # Log de hace 2 días (comprimido)
├── ...
└── miapp.log.7.gz  # Log de hace 7 días (comprimido)

También es posible especificar configuraciones diferentes para distintos ficheros de log dentro del mismo archivo de configuración:

/var/log/miapp/access.log
/var/log/miapp/error.log
/var/log/miapp/debug.log
{
    daily
    rotate 14
    compress
    delaycompress
    notifempty
    missingok
    create 0640 juanje admins
}

/var/log/miapp/transactions.log
{
    weekly
    rotate 4
    compress
    delaycompress
    notifempty
    missingok
    create 0640 juanje admins
}

Un ejemplo real es la configuración por defecto que tiene NGINX para rotar sus logs, que podemos encontrar en /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
            run-parts /etc/logrotate.d/httpd-prerotate; \
        fi \
    endscript
    postrotate
        invoke-rc.d nginx rotate >/dev/null 2>&1
    endscript
}

En este caso, antes de rotar los logs, prerotate invocará a run-parts, que ejecutará cualquier script que se encuentre en el directorio /etc/logrotate.d/httpd-prerotate.

Tras la rotación, postrotate recargará NGINX para que empiece a escribir en los nuevos archivos de log.

Probar la configuración

Siempre debemos probar nuestras configuraciones antes de aplicarlas. Para ello, podemos ejecutar logrotate con el parámetro -d (debug) que simula la rotación sin realizar cambios reales:

# Probar configuración global
logrotate -d /etc/logrotate.conf

# Probar configuración específica
logrotate -d /etc/logrotate.d/nginx

Salida:

warning: logrotate in debug mode does nothing except printing debug messages!  Consider using verbose mode (-v) instead if this is not what you want.

reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file alternatives
reading config file apt
...
reading config file rsyslog
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entries
Creating new state
...

Handling 12 logs

rotating pattern: /var/log/alternatives.log monthly empty log files are not rotated, (12 rotations), old logs are removed
considering log /var/log/alternatives.log
  Now: 2026-02-03 02:28
  Last rotated at 2026-02-02 01:52
  log does not need rotating (log has been rotated at 2026-02-02 01:52, which is less than a month ago)
...

Forzar rotación

Por otro lado, para forzar la rotación inmediata, usaremos el parámetro -f (force):

# Forzar todos los logs
logrotate -f /etc/logrotate.conf

# Forzar configuración específica
logrotate -f /etc/logrotate.d/nginx

Logrotate Force - Forzar rotación

A pesar de no generar salida, podemos ver que su código de salida es 0, indicando que se ejecutó correctamente.

Conclusión

Logrotate es una herramienta esencial para cualquier administrador de sistemas Linux que te ahorrará muchos dolores de cabeza automatizando el ciclo de vida de tus archivos de log.

Y a pesar de que esté configurado por defecto en la mayoría de distribuciones, nunca está de más aprender a modificar y adaptar sus ficheros de configuración a las necesidades de nuestra infraestructura.

Referencias