Rotación y compresión de registros usando logrotate
- Nivel: Intermedio
- Tiempo estimado: ~20 minutos
- Objetivo: Configurar logrotate para comprimir y rotar automáticamente los archivos de registro de la aplicación para evitar el agotamiento del espacio en disco.
Introducción
Los registros son una parte crítica de la gestión de cualquier aplicación en producción: sin ellos, entender de manera confiable qué salió mal y qué hacer al respecto sería muy difícil. Una aplicación ocupada puede generar miles de entradas por minuto, y todas ellas se almacenan típicamente en archivos. Necesitamos comprimir y eliminar los registros antiguos de manera oportuna para evitar quedarnos sin espacio en disco. En este tutorial, configuraremos logrotate en un servidor Linux.
¿Qué es logrotate?
logrotate es una utilidad de Linux diseñada para simplificar la administración de sistemas que generan grandes cantidades de archivos de registro. Permite que los registros se compriman, roten y eliminen automáticamente. Normalmente se ejecuta diariamente, semanalmente o mensualmente a través de cron o un temporizador de systemd.
Requisitos previos
Antes de comenzar, asegúrese de que se cumplan las siguientes condiciones:
- Sistema operativo: Ubuntu 20.04/22.04/24.04 LTS, Debian 11/12, o CentOS/RHEL 7+
- logrotate: versión 3.x (verificar en el paso 1)
- Acceso: acceso sudo o root al servidor
- Conocimientos requeridos: uso confiado de la línea de comandos de Linux y edición básica de archivos
Paso 1: Verificar la instalación de logrotate
Para verificar la instalación, simplemente ejecute:
logrotate --version
Salida esperada:
logrotate 3.19.0 Comando de correo predeterminado: /usr/bin/mail Comando de compresión predeterminado: /bin/gzip Comando de descompresión predeterminado: /bin/gunzip Extensión de compresión predeterminada: .gz Ruta del archivo de estado predeterminada: /var/lib/logrotate/status
Si el comando no se encuentra, logrotate no está instalado. Instálelo:
Debian/Ubuntu:
sudo apt install logrotate
CentOS/RHEL:
sudo yum install logrotate
Paso 2: Comprender la estructura de configuración
El archivo de configuración principal se encuentra en /etc/logrotate.conf – lo dejaremos sin cambios por ahora. Nuestras reglas para servicios específicos irán en /etc/logrotate.d/ – se debe colocar un archivo separado allí para cada servicio.
Antes de agregar algo, verifique si ya existe una configuración para su servicio:
ls /etc/logrotate.d/
Para servicios populares como nginx o Apache, las configuraciones suelen estar ya presentes. Si nginx o apache2 ya están allí, abra ese archivo y ajuste la cantidad de rotaciones y la configuración de compresión según sus necesidades, en lugar de crear un duplicado.
Paso 3: Agregar una configuración de servicio
Supongamos que hay una aplicación personalizada y sus registros se encuentran en /opt/myapp/*.log.
Cree y abra el archivo:
sudo nano /etc/logrotate.d/myapp
Pegue lo siguiente dentro:
/opt/myapp/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate systemctl reload myapp > /dev/null 2>&1 || true endscript }
Esta configuración instruye a logrotate para:
- daily – rotar los registros diariamente; también puede especificar
weeklyomonthly. - missingok – no fallar con un error si falta el archivo de registro.
- rotate 14 – mantener 14 copias rotadas antes de la eliminación.
- compress – comprimir los registros rotados usando gzip.
- delaycompress – no comprimir la rotación más reciente; útil si la aplicación aún mantiene el archivo abierto.
- notifempty – omitir la rotación si el archivo de registro está vacío.
- create 0640 www-data adm – crear un nuevo archivo de registro vacío con los permisos, propietario y grupo especificados. El propietario debe coincidir con el usuario bajo el cual se ejecuta la aplicación (en sistemas basados en Debian a menudo
www-data, en sistemas basados en RHEL generalmenteapacheonginx). - sharedscripts – ejecutar el script postrotate una vez, incluso si se han coincidido varios archivos.
- postrotate – señalar a la aplicación que vuelva a abrir sus manejadores de archivos después de la rotación.
Si el directorio /opt/myapp/ o los archivos de registro aún no existen en el momento de la primera ejecución, eso no es un problema. La directiva missingok hará que logrotate omita silenciosamente el archivo sin lanzar un error. La rotación de registros comenzará automáticamente tan pronto como la aplicación cree los registros.
Paso 4: Probar la configuración
4.1 Ejecución de prueba
Después de escribir la configuración, debe verificarse. La opción -d ejecuta logrotate en modo de depuración – no se cambia nada realmente:
sudo logrotate -d /etc/logrotate.d/myapp
El modo -d muestra información de diagnóstico pero no modifica ningún archivo.
4.2 Ejecución real forzada
Si la ejecución de prueba parece correcta, fuerce una rotación real usando la opción -f:
sudo logrotate -f /etc/logrotate.d/myapp
Importante: La opción -f desencadena una rotación real. Ejecútela solo después de que la prueba parezca correcta.
Paso 5: Verificar el resultado
Después de las primeras rotaciones, verifique el directorio de registros:
ls -lh /opt/myapp/
Salida esperada:
total 28K -rw-r----- 1 www-data adm 0 Jan 17 12:00 app.log -rw-r----- 1 www-data adm 12K Jan 17 11:59 app.log.1 -rw-r----- 1 www-data adm 11K Jan 16 12:00 app.log.2.gz -rw-r----- 1 www-data adm 9K Jan 15 12:00 app.log.3.gz
La rotación más reciente (app.log.1) permanece sin comprimir debido a delaycompress. Todo lo más antiguo está comprimido en gzip. Eso es exactamente lo que queríamos.
Paso 6: Verificar la programación automática
logrotate se ejecuta automáticamente – a través de cron o un temporizador de systemd, dependiendo de la distribución.
Sistemas basados en cron
cat /etc/cron.daily/logrotate
Si el archivo existe, ese es el archivo que ejecuta logrotate diariamente.
Sistemas basados en systemd
En sistemas más nuevos, logrotate puede ejecutarse a través de un temporizador de systemd en lugar de cron.
Verifique:
systemctl list-timers | grep logrotate
Debería ver un temporizador con las horas de la última y próxima ejecución, algo como:
Thu 2026-01-18 00:00:00 UTC 23h left Wed 2026-01-17 00:00:11 UTC 47 min ago logrotate.timer
Si el logrotate.timer falta en la salida, el temporizador está deshabilitado. Habilítelo:
sudo systemctl enable logrotate.timer
sudo systemctl start logrotate.timer
Archivo de estado
Puede verificar cuándo se ejecutó logrotate por última vez a través de su propio archivo de estado:
cat /var/lib/logrotate/status
Este es el historial de rotación propio de logrotate. Después de la primera ejecución real, verá cada archivo de registro con la fecha de su última rotación:
"/opt/myapp/app.log" 2026-1-17 "/var/log/nginx/access.log" 2026-1-17
Si algún registro no se está rotando cuando se espera, este es el primer lugar para mirar.
Reversión
Para deshacer todo lo hecho, simplemente elimine el archivo de configuración de /etc/logrotate.d/:
sudo rm /etc/logrotate.d/myapp
Esto detendrá el procesamiento de registros para su aplicación. Los archivos ya rotados no se eliminan.
Para eliminar logrotate por completo:
Debian/Ubuntu:
sudo apt remove logrotate
CentOS/RHEL:
sudo yum remove logrotate
Importante: Eliminar logrotate deshabilitará la rotación de registros para todo el sistema, incluidos nginx, rsyslog y otros servicios que dependen de él.
Conclusión
Eso es todo. Un archivo bien escrito en /etc/logrotate.d/, verificado con -d – y está hecho. Los registros se mantienen limpios, el disco se mantiene saludable, y no tiene que pensar más en ello.
Versión del documento: 1.2
Última actualización: Marzo 2026
Propietario: Equipo de Documentación Técnica