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
grepyawkse 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:
-
Un temporizador de systemd activa logrotate diariamente — En sistemas Ubuntu modernos, la unidad
logrotate.timerejecutalogrotate.serviceuna vez al dia. En sistemas antiguos, un trabajo cron en/etc/cron.daily/logrotatese encargaba de esto. -
Logrotate lee su configuracion — Carga
/etc/logrotate.conf(la configuracion global), que incluye todos los archivos bajo/etc/logrotate.d/. -
Verifica cada archivo de log contra sus reglas — Basandose en las directivas (daily, size, etc.), logrotate determina si cada archivo de log necesita rotacion.
-
La rotacion ocurre — El archivo de log actual se renombra (por ejemplo,
access.logse convierte enaccess.log.1), y se crea un nuevo archivo vacio. Los archivos rotados anteriores se renumeran (access.log.1se convierte enaccess.log.2, etc.). -
La compresion se ejecuta — Los archivos rotados se comprimen (tipicamente con gzip), con
delaycompressesperando un ciclo antes de comprimir. -
Los scripts de post-rotacion se ejecutan — Los comandos dentro de bloques
postrotate/endscriptse 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.logen el directorio de logs de Nginxdaily— Rota cada dia (sobreescribe elweeklyglobal)rotate 14— Mantiene dos semanas de logs rotadosdelaycompress— No comprime el log de ayer inmediatamente; esto permite que las herramientas de analisis lo procesen primerocreate 0640 www-data adm— El nuevo archivo de log sera propiedad dewww-datacon grupoadm, y permisos0640sharedscripts— Ejecuta el script postrotate solo una vez, incluso si multiples archivos de log coinciden con el patron globpostrotate— Envia la senalUSR1a Nginx, que le indica reabrir sus archivos de log sin reiniciar
Importante: La senal
USR1es 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:
-
copytruncatevscreate— Si tu aplicacion no puede reabrir sus archivos de log (muchas aplicaciones Node.js y Python mantienen el descriptor de archivo abierto), usacopytruncate. 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 30conmaxage 90— Mantiene 30 archivos rotados, pero tambien elimina cualquier cosa mas antigua de 90 dias. La directivamaxageproporciona una red de seguridad. -
dateext— Usa nombres basados en fecha comoapp.log-20260114.gzen lugar de nombres numericos comoapp.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
|| trueo; truepara evitar que los fallos del script detengan logrotate - Usa
sharedscriptscuando 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:
sizereemplaza la rotacion basada en tiempo completamente — logrotate solo verifica el tamano del archivomaxsizefunciona junto con la rotacion basada en tiempo — rota segun calendario O cuando el tamano se excede, lo que ocurra primerominsizepreviene 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
| Directiva | Descripcion | Ejemplo |
|---|---|---|
daily | Rota archivos de log cada dia | daily |
weekly | Rota archivos de log una vez por semana | weekly |
monthly | Rota archivos de log una vez por mes | monthly |
rotate N | Mantiene N archivos rotados antes de eliminar | rotate 7 |
compress | Comprime archivos rotados con gzip | compress |
delaycompress | Retrasa la compresion un ciclo de rotacion | delaycompress |
missingok | No genera error si el archivo de log falta | missingok |
notifempty | No rota si el archivo de log esta vacio | notifempty |
create mode owner group | Crea nuevo archivo de log con atributos especificados | create 0640 www-data adm |
copytruncate | Copia el log y luego trunca el original | copytruncate |
size N | Rota cuando el archivo supera N bytes/KB/MB | size 100M |
maxsize N | Rota segun calendario o cuando tamano supera N | maxsize 500M |
minsize N | Solo rota si el archivo tiene al menos tamano N | minsize 1M |
maxage N | Elimina archivos rotados mayores de N dias | maxage 90 |
dateext | Usa sufijos basados en fecha para archivos rotados | dateext |
sharedscripts | Ejecuta scripts postrotate solo una vez para todos los archivos coincidentes | sharedscripts |
postrotate/endscript | Comandos shell a ejecutar despues de la rotacion | Ver ejemplos arriba |
prerotate/endscript | Comandos shell a ejecutar antes de la rotacion | Ver ejemplos arriba |
olddir /ruta | Mueve archivos rotados a un directorio diferente | olddir /var/log/archive |
su user group | Ejecuta la rotacion como un usuario y grupo especifico | su 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.confestablece los valores predeterminados; las configuraciones por aplicacion en/etc/logrotate.d/los sobreescriben - Usa
dailyconcompressyrotate 14como punto de partida sensato para la mayoria de servicios - Siempre usa scripts
postrotatepara senalar a las aplicaciones que reabran sus archivos de log - Prueba cada configuracion con
logrotate -dantes de implementarla - Usa
copytruncatepara aplicaciones que no pueden reabrir sus archivos de log - Combina
dailyconmaxsizepara 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.