LOGROTATE — GESTION DEL CICLO DE VIDA DE LOGS Log Creciente access.log 2.4 GB Disco: 95% logrotate Rotar Comprimir Purgar antiguos Notificar app Archivos Rotados access.log (nuevo) access.log.1.gz 120K access.log.2.gz 115K access.log.3.gz 118K Disco: 12% Temporizador systemd logrotate.timer Ejecucion diaria Config /etc/logrotate.conf /etc/logrotate.d/ Reglas por app Ciclo de vida automatizado: rotar, comprimir, purgar, repetir

Los archivos de log crecen silenciosamente en segundo plano de cada servidor Linux. Servidores web, frameworks de aplicaciones, bases de datos y demonios del sistema escriben en archivos de log continuamente. Sin control, estos archivos consumiran todo el espacio disponible en disco, causando eventualmente interrupciones de servicio, escrituras fallidas y rendimiento degradado. Logrotate es la utilidad estandar en Linux que resuelve este problema rotando, comprimiendo y eliminando automaticamente archivos de log antiguos segun un calendario que tu defines.

Esta guia cubre todo lo que necesitas para configurar logrotate de manera efectiva: la configuracion global, configuraciones por aplicacion, configuraciones especificas para Nginx, scripts de post-rotacion y como solucionar problemas cuando las cosas salen mal.

Requisitos Previos

Antes de comenzar, asegurate de tener:

  • Un servidor Linux con Ubuntu 20.04, 22.04 o 24.04 (las instrucciones tambien aplican a Debian y la mayoria de distribuciones basadas en RHEL)
  • Acceso a terminal con privilegios sudo
  • Familiaridad basica con la linea de comandos y edicion de texto (nano o vim)
  • Archivos de log que necesiten gestion (servidor web, aplicacion o logs del sistema)

¿Que es Logrotate?

Logrotate es una utilidad del sistema disenada para simplificar la administracion de archivos de log. Automatiza la rotacion, compresion y eliminacion de archivos de log para que no llenen tu sistema de archivos. Logrotate viene preinstalado en practicamente todas las distribuciones Linux y ha sido la herramienta estandar de gestion de logs durante decadas.

Lo que logrotate hace:

  • Rota archivos de log renombrandolos con un sufijo numerico o sello de fecha
  • Comprime archivos de log antiguos usando gzip (u otros algoritmos) para ahorrar espacio en disco
  • Elimina archivos de log mas antiguos que un numero especificado de rotaciones
  • Senala a las aplicaciones que reabran sus archivos de log despues de la rotacion
  • Ejecuta scripts personalizados antes o despues de la rotacion
# Verify logrotate is installed
logrotate --version

# Expected output:
# logrotate 3.21.0

¿Por que Importa la Rotacion de Logs?

Sin rotacion de logs, un servidor Nginx ocupado generando 50,000 solicitudes por dia puede producir logs de acceso que crecen cientos de megabytes diariamente. En semanas o meses, estos archivos se inflan a gigabytes. Las consecuencias son predecibles:

  • Disco lleno — los servicios se caen cuando el sistema de archivos llega al 100% de capacidad
  • Analisis lento de logs — herramientas como grep y awk se vuelven impracticas en archivos de multiples gigabytes
  • Respaldos inflados — logs sin comprimir inflan los tamanos de respaldo y tiempos de transferencia
  • Riesgo de cumplimiento — algunas regulaciones requieren politicas de retencion de logs con calendarios de purga definidos

Una configuracion simple de logrotate previene todos estos problemas con cero esfuerzo continuo.

Como Funciona Logrotate

Logrotate sigue un flujo de ejecucion directo:

  1. Un temporizador de systemd activa logrotate diariamente — En sistemas Ubuntu modernos, la unidad logrotate.timer ejecuta logrotate.service una vez al dia. En sistemas antiguos, un trabajo cron en /etc/cron.daily/logrotate se encargaba de esto.

  2. Logrotate lee su configuracion — Carga /etc/logrotate.conf (la configuracion global), que incluye todos los archivos bajo /etc/logrotate.d/.

  3. Verifica cada archivo de log contra sus reglas — Basandose en las directivas (daily, size, etc.), logrotate determina si cada archivo de log necesita rotacion.

  4. La rotacion ocurre — El archivo de log actual se renombra (por ejemplo, access.log se convierte en access.log.1), y se crea un nuevo archivo vacio. Los archivos rotados anteriores se renumeran (access.log.1 se convierte en access.log.2, etc.).

  5. La compresion se ejecuta — Los archivos rotados se comprimen (tipicamente con gzip), con delaycompress esperando un ciclo antes de comprimir.

  6. Los scripts de post-rotacion se ejecutan — Los comandos dentro de bloques postrotate/endscript se ejecutan, tipicamente enviando una senal a la aplicacion para que reabra su archivo de log.

Verifica que el temporizador esta activo:

# Check the systemd timer
systemctl status logrotate.timer

# See when it last ran and when it will run next
systemctl list-timers logrotate

Configuracion Global (/etc/logrotate.conf)

El archivo de configuracion global establece directivas predeterminadas que aplican a todos los archivos de log a menos que sean sobreescritas por configuraciones especificas de aplicacion.

# View the global configuration
cat /etc/logrotate.conf

Una configuracion predeterminada tipica se ve asi:

# /etc/logrotate.conf

# Rotate log files weekly
weekly

# Keep 4 weeks of rotated logs
rotate 4

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

# Use date as a suffix of the rotated file
dateext

# Compress rotated log files
compress

# Packages drop their config snippets into this directory
include /etc/logrotate.d

Puntos clave sobre la configuracion global:

  • weekly — Rota los logs una vez por semana. Este es el calendario predeterminado.
  • rotate 4 — Mantiene 4 archivos rotados antes de eliminar el mas antiguo. Con rotacion semanal, esto mantiene un mes de logs.
  • create — Despues de rotar, crea un nuevo archivo de log vacio con los mismos permisos que el original.
  • dateext — Agrega la fecha (por ejemplo, -20260114) en lugar de un sufijo numerico a los archivos rotados.
  • compress — Comprime los archivos rotados con gzip.
  • include /etc/logrotate.d — Carga todos los archivos de configuracion especificos de aplicacion desde este directorio.

Configuraciones Especificas por Aplicacion (/etc/logrotate.d/)

Cada aplicacion puede tener su propio archivo de configuracion de logrotate en /etc/logrotate.d/. Estos archivos sobreescriben los valores predeterminados globales para archivos de log especificos.

# List all application-specific configs
ls -la /etc/logrotate.d/

# Common files you might see:
# apt        dpkg       nginx      rsyslog
# alternatives  cups    samba      ufw

Cada archivo sigue el mismo formato: una ruta de archivo de log (o patron glob), seguida de directivas entre llaves.

# Example: /etc/logrotate.d/rsyslog
/var/log/syslog
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/cron.log
{
    rotate 4
    weekly
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

Directivas de Configuracion Explicadas

Logrotate ofrece decenas de directivas para controlar exactamente como se comporta la rotacion. Aqui estan las mas importantes:

Frecuencia de Rotacion

daily       # Rotate every day
weekly      # Rotate once per week (default)
monthly     # Rotate once per month
yearly      # Rotate once per year

Retencion

rotate 7    # Keep 7 rotated files before deleting the oldest
maxage 30   # Remove rotated logs older than 30 days

Compresion

compress         # Compress rotated files (gzip by default)
delaycompress    # Wait one rotation cycle before compressing
compresscmd /usr/bin/xz    # Use xz instead of gzip
compressoptions "-9"       # Pass options to the compression command
nocompress       # Do not compress rotated files

Manejo de Archivos

missingok     # Do not error if the log file is missing
notifempty    # Do not rotate the log if it is empty
create 0640 www-data adm    # Create new file with specific mode, owner, group
copytruncate  # Copy the log and truncate the original (for apps that hold the file open)

Nomenclatura

dateext             # Use date-based suffixes (-20260114)
dateformat -%Y%m%d  # Customize the date format
extension .log      # Preserve the .log extension after the date suffix

Configuracion Personalizada para Nginx

Nginx es uno de los servicios mas comunes que requiere una configuracion de logrotate. Cuando Nginx se instala desde los paquetes oficiales, generalmente incluye un archivo de configuracion, pero puede que necesites personalizarlo.

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    rotate 14
    missingok
    notifempty
    compress
    delaycompress
    create 0640 www-data adm
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 $(cat /var/run/nginx.pid)
        fi
    endscript
}

Lo que hace cada directiva en este contexto:

  • /var/log/nginx/*.log — Aplica estas reglas a todos los archivos .log en el directorio de logs de Nginx
  • daily — Rota cada dia (sobreescribe el weekly global)
  • rotate 14 — Mantiene dos semanas de logs rotados
  • delaycompress — No comprime el log de ayer inmediatamente; esto permite que las herramientas de analisis lo procesen primero
  • create 0640 www-data adm — El nuevo archivo de log sera propiedad de www-data con grupo adm, y permisos 0640
  • sharedscripts — Ejecuta el script postrotate solo una vez, incluso si multiples archivos de log coinciden con el patron glob
  • postrotate — Envia la senal USR1 a Nginx, que le indica reabrir sus archivos de log sin reiniciar

Importante: La senal USR1 es especifica de Nginx. Otras aplicaciones usan senales diferentes o requieren un reinicio completo. Siempre consulta la documentacion de tu servicio especifico.

Configuracion Personalizada para Logs de Aplicaciones

Para logs de aplicaciones personalizadas (Rails, Node.js, Django, o cualquier aplicacion que escriba sus propios logs), necesitas crear una configuracion de logrotate desde cero.

# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    copytruncate
    dateext
    dateformat -%Y%m%d
    maxage 90
}

Decisiones clave para logs de aplicaciones:

  • copytruncate vs create — Si tu aplicacion no puede reabrir sus archivos de log (muchas aplicaciones Node.js y Python mantienen el descriptor de archivo abierto), usa copytruncate. Esto copia el contenido a un archivo rotado y luego trunca el original. Hay una pequena ventana donde las lineas de log se pueden perder entre la copia y el truncado, pero para la mayoria de aplicaciones esto es aceptable.

  • rotate 30 con maxage 90 — Mantiene 30 archivos rotados, pero tambien elimina cualquier cosa mas antigua de 90 dias. La directiva maxage proporciona una red de seguridad.

  • dateext — Usa nombres basados en fecha como app.log-20260114.gz en lugar de nombres numericos como app.log.1.gz. Esto facilita encontrar logs de una fecha especifica.

Si tu aplicacion soporta reapertura de logs basada en senales:

# /etc/logrotate.d/myapp-with-signal
/var/log/myapp/*.log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    create 0644 appuser appgroup
    sharedscripts
    postrotate
        systemctl kill --signal=HUP myapp.service
    endscript
}

Scripts de Post-Rotacion (postrotate/endscript)

Los scripts de post-rotacion son bloques de comandos shell que se ejecutan despues de que la rotacion de logs se completa. Son esenciales para senalar a las aplicaciones que reabran sus archivos de log.

postrotate
    # This block runs after rotation
    /usr/bin/systemctl reload nginx > /dev/null 2>&1 || true
endscript

Tambien hay scripts prerotate que se ejecutan antes de la rotacion:

prerotate
    # This block runs before rotation
    if [ -d /etc/logrotate.d/httpd-prerotate ]; then
        run-parts /etc/logrotate.d/httpd-prerotate
    fi
endscript

Reglas importantes para scripts de rotacion:

  • Siempre termina con || true o ; true para evitar que los fallos del script detengan logrotate
  • Usa sharedscripts cuando la ruta del log contiene un patron glob — esto asegura que el bloque postrotate se ejecute solo una vez en lugar de una vez por archivo coincidente
  • Mantiene los scripts minimos y rapidos — logrotate se bloquea mientras los scripts se ejecutan
  • Prueba los scripts manualmente antes de agregarlos a una configuracion de logrotate

Patrones comunes de senales para servicios populares:

# Nginx -- reopen log files
kill -USR1 $(cat /var/run/nginx.pid)

# Apache -- graceful restart
/usr/sbin/apachectl graceful > /dev/null 2>&1

# rsyslog -- reopen log files
/usr/lib/rsyslog/rsyslog-rotate

# systemd service -- generic signal
systemctl kill --signal=HUP myservice.service

Pruebas y Depuracion

Siempre prueba tus configuraciones de logrotate antes de esperar a que el temporizador diario las active.

Modo Depuracion (Ejecucion en Seco)

El modo depuracion simula la rotacion sin hacer ningun cambio. Muestra exactamente lo que logrotate haria:

# Test a specific config file
sudo logrotate -d /etc/logrotate.d/nginx

# Test the entire configuration
sudo logrotate -d /etc/logrotate.conf

Ejemplo de salida de depuracion:

reading config file /etc/logrotate.d/nginx

Handling 1 logs

rotating pattern: /var/log/nginx/*.log  after 1 days (14 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
  Now: 2026-01-14 10:00
  Last rotated at 2026-01-13 06:00
  log needs rotating
considering log /var/log/nginx/error.log
  Now: 2026-01-14 10:00
  Last rotated at 2026-01-13 06:00
  log needs rotating

Forzar Rotacion

Fuerza una rotacion inmediata sin importar el calendario:

# Force rotation for a specific config
sudo logrotate -f /etc/logrotate.d/nginx

# Force rotation with verbose output
sudo logrotate -vf /etc/logrotate.d/nginx

Verificando el Archivo de Estado

Logrotate rastrea cuando se roto por ultima vez cada archivo de log en un archivo de estado:

# View the state file
cat /var/lib/logrotate/status

# You'll see entries like:
# "/var/log/nginx/access.log" 2026-1-14-6:0:0
# "/var/log/nginx/error.log" 2026-1-14-6:0:0
# "/var/log/syslog" 2026-1-13-6:0:0

Si logrotate no esta rotando un archivo que esperas que rote, verifica este archivo de estado. Si la fecha de la ultima rotacion es reciente, logrotate omitira el archivo hasta que pase el siguiente intervalo de rotacion.

Rotacion Basada en Tamano vs Basada en Tiempo

Logrotate soporta tanto rotacion basada en tiempo como basada en tamano, y puedes combinarlas.

Solo Basada en Tiempo

/var/log/myapp/*.log {
    daily        # Rotate every day regardless of file size
    rotate 7
    compress
}

Solo Basada en Tamano

/var/log/myapp/*.log {
    size 100M    # Rotate only when the file exceeds 100 MB
    rotate 5
    compress
}

Combinada: Basada en Tiempo con Limites de Tamano

/var/log/myapp/*.log {
    daily
    rotate 14
    compress
    maxsize 200M    # Also rotate if file exceeds 200 MB before the daily schedule
    minsize 1M      # Do not rotate if the file is smaller than 1 MB, even on schedule
}

Diferencias clave:

  • size reemplaza la rotacion basada en tiempo completamente — logrotate solo verifica el tamano del archivo
  • maxsize funciona junto con la rotacion basada en tiempo — rota segun calendario O cuando el tamano se excede, lo que ocurra primero
  • minsize previene la rotacion de archivos de log pequenos — el log debe tener al menos este tamano Y el intervalo de tiempo debe haber pasado

Para servidores de alto trafico, la combinacion de daily con maxsize proporciona el mejor equilibrio entre calendarios predecibles y proteccion del espacio en disco.

Tabla de Referencia de Directivas de Logrotate

DirectivaDescripcionEjemplo
dailyRota archivos de log cada diadaily
weeklyRota archivos de log una vez por semanaweekly
monthlyRota archivos de log una vez por mesmonthly
rotate NMantiene N archivos rotados antes de eliminarrotate 7
compressComprime archivos rotados con gzipcompress
delaycompressRetrasa la compresion un ciclo de rotaciondelaycompress
missingokNo genera error si el archivo de log faltamissingok
notifemptyNo rota si el archivo de log esta vacionotifempty
create mode owner groupCrea nuevo archivo de log con atributos especificadoscreate 0640 www-data adm
copytruncateCopia el log y luego trunca el originalcopytruncate
size NRota cuando el archivo supera N bytes/KB/MBsize 100M
maxsize NRota segun calendario o cuando tamano supera Nmaxsize 500M
minsize NSolo rota si el archivo tiene al menos tamano Nminsize 1M
maxage NElimina archivos rotados mayores de N diasmaxage 90
dateextUsa sufijos basados en fecha para archivos rotadosdateext
sharedscriptsEjecuta scripts postrotate solo una vez para todos los archivos coincidentessharedscripts
postrotate/endscriptComandos shell a ejecutar despues de la rotacionVer ejemplos arriba
prerotate/endscriptComandos shell a ejecutar antes de la rotacionVer ejemplos arriba
olddir /rutaMueve archivos rotados a un directorio diferenteolddir /var/log/archive
su user groupEjecuta la rotacion como un usuario y grupo especificosu root adm

Resolucion de Problemas

Logrotate No Esta Rotando un Archivo

# 1. Check for syntax errors
sudo logrotate -d /etc/logrotate.d/yourconfig

# 2. Verify the log file path matches the glob pattern
ls -la /var/log/myapp/*.log

# 3. Check the state file for the last rotation date
grep "myapp" /var/lib/logrotate/status

# 4. Verify the timer is running
systemctl status logrotate.timer

Errores de Permisos Denegados

# Check ownership and permissions of the log file
ls -la /var/log/myapp/app.log

# Check that the logrotate config uses the correct su directive
# Add this inside your config block:
su root adm

El Espacio en Disco No se Libera Despues de la Rotacion

Si el espacio en disco no se libera despues de la rotacion, una aplicacion puede estar manteniendo abierto el archivo antiguo (eliminado):

# Find processes holding deleted files open
sudo lsof +L1 | grep deleted

# Restart the offending service to release the file descriptor
sudo systemctl restart myapp

Este es exactamente el escenario donde copytruncate ayuda — trunca el archivo en su lugar en vez de eliminarlo, por lo que el descriptor de archivo permanece valido.

Corrupcion del Archivo de Estado

Si logrotate se comporta de forma erratica, el archivo de estado puede estar corrupto:

# Back up the current state file
sudo cp /var/lib/logrotate/status /var/lib/logrotate/status.bak

# Remove the state file (logrotate will recreate it)
sudo rm /var/lib/logrotate/status

# Force a full rotation to rebuild state
sudo logrotate -f /etc/logrotate.conf

Logs Rotados Pero No Comprimidos

Si ves archivos .1 sin comprimir junto a archivos .2.gz comprimidos, esto es comportamiento esperado cuando delaycompress esta habilitado. El archivo mas recientemente rotado permanece sin comprimir durante un ciclo. Si necesitas compresion inmediata, elimina la directiva delaycompress.

Resumen

Logrotate es una de esas utilidades que trabaja silenciosamente en segundo plano hasta que algo sale mal — y cuando sale mal, generalmente significa que tu disco esta lleno. Tomarte 15 minutos para configurar logrotate correctamente para tus aplicaciones ahorra horas de limpieza de disco de emergencia despues.

Los puntos clave a recordar:

  • La configuracion global en /etc/logrotate.conf establece los valores predeterminados; las configuraciones por aplicacion en /etc/logrotate.d/ los sobreescriben
  • Usa daily con compress y rotate 14 como punto de partida sensato para la mayoria de servicios
  • Siempre usa scripts postrotate para senalar a las aplicaciones que reabran sus archivos de log
  • Prueba cada configuracion con logrotate -d antes de implementarla
  • Usa copytruncate para aplicaciones que no pueden reabrir sus archivos de log
  • Combina daily con maxsize para servidores de alto trafico

Para asegurar el resto de tu servidor, consulta nuestra Lista de Verificacion de Seguridad para Servidores Linux: 20 Pasos Esenciales y la Guia Completa de Nginx como Proxy Inverso para configurar Nginx correctamente desde el principio.