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
rooto mediantesudo/doas. En mi caso lo haré comoroot(usandosu). - (Opcional) Servicios generando logs como NGINX, Docker, Apache, etc.
Consideraciones a tener en cuenta
-
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 tienesystemd, es posible que utilicecrony se gestione en el fichero/etc/cron.daily/logrotate. De hecho, si revisamos el contenido del script decron, veremos que si detecta quesystemdestá presente, no hace nada (exit 0):cat /etc/cron.daily/logrotate
Por su parte, el timer de
systemdse ubica en la ruta/usr/lib/systemd/system/logrotate.timery 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 -
Es fundamental testear las configuraciones antes de aplicarlas usando el modo debug (
-d). -
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?
- Se ejecuta de forma recurrente mediante timers de systemd (
logrotate.timer) o cron jobs (/etc/cron.daily/logrotate). - Lee las configuraciones de
/etc/logrotate.confy/etc/logrotate.d/. - Aplica las reglas definidas para cada archivo o conjunto de archivos.
- Ejecuta comandos y scripts pre y post-rotación si están configurados.
- 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:
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
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:
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.logdel directorio/var/log/miapp/daily: Rotar cada díarotate 7: Mantener 7 rotaciones de logscompress: Comprimir logs antiguosdelaycompress: No comprimir el log del día anterior (útil si alguien necesita consultarlo)notifempty: No rotar archivos vacíosmissingok: No fallar si el archivo no existecreate 0640 juanje admins: Crear nuevo archivo con permisos 0640, propietario juanje y grupo adminssharedscripts: Ejecutar scripts una sola vez por rotación en lugar de una vez por cada archivoprerotateypostrotate: 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
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
- man logrotate - Manual oficial de logrotate