Gestión de logs con logrotate en Ubuntu 16.04
Cómo configurar logrotate para mantener bajo control los logs del sistema y de las aplicaciones.
Logrotate es una utilidad del sistema que gestiona la rotación automática, la compresión y la limpieza de los archivos de log. Sin una gestión adecuada, los logs de un servidor en funcionamiento continuo pueden acabar ocupando todo el espacio en disco disponible — logrotate evita que esto llegue a ser un problema.
En Ubuntu 16.04, logrotate viene preinstalado y ya está configurado para gestionar la rotación de logs de todos los paquetes del sistema y las aplicaciones.
Comprobar la instalación
logrotate --version
Deberías ver algo parecido a:
logrotate 3.8.7
Estructura de la configuración
La configuración de logrotate se encuentra en dos lugares:
/etc/logrotate.conf— el archivo de configuración principal, con los valores predeterminados globales y las plantillas para los archivos no del sistema/etc/logrotate.d/— un directorio con archivos de configuración por servicio que amplían o reemplazan esos valores predeterminados
Veamos la configuración integrada para apt como ejemplo:
cat /etc/logrotate.d/apt
Salida:
/var/log/apt/term.log {
rotate 12
monthly
compress
missingok
notifempty
}
/var/log/apt/history.log {
rotate 12
monthly
compress
missingok
notifempty
}
Este archivo define las reglas de rotación para term.log y history.log. Cualquier directiva no especificada aquí recurre a los valores predeterminados globales de /etc/logrotate.conf.
Qué hace cada directiva:
rotate 12— conservar 12 copias archivadas antes de eliminar las más antiguasmonthly— rotar una vez al mescompress— comprimir los logs archivados (gzip por defecto)missingok— no generar un error si el archivo de log no existenotifempty— omitir la rotación si el archivo de log está vacío
Método 1 — Añadir una configuración en /etc/logrotate.d/
Este es el enfoque estándar para la mayoría de las aplicaciones. La configuración se ejecuta diariamente como root junto con el resto de jobs de logrotate.
A continuación se muestra un ejemplo para una aplicación que escribe access.log y error.log en /var/log/example-app/:
sudo nano /etc/logrotate.d/example-app
/var/log/example-app/*.log {
daily
missingok
rotate 14
compress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload example-app
endscript
}
Qué hace cada directiva:
create 0640 www-data www-data— crear un nuevo archivo de log vacío tras la rotación con permisos0640, propiedad dewww-datasharedscripts— ejecutar el scriptpostrotateuna sola vez después de procesar todos los archivos coincidentes, en lugar de una vez por archivopostrotate ... endscript— comandos que se ejecutan tras la rotación; en este ejemplo, la aplicación se recarga para que utilice el nuevo archivo de log
Una vez configurado, pruébalo sin realizar ningún cambio real:
sudo logrotate /etc/logrotate.conf --debug
Este modo de simulación muestra en detalle qué haría logrotate — no se modifica nada.
Nuestros servicios y productos
Método 2 — Configuración personalizada con planificación cron
Si necesitas una rotación con una frecuencia no estándar — por ejemplo, cada hora — lo más conveniente es crear una configuración fuera de /etc/logrotate.d/ y ejecutarla manualmente mediante cron.
En este ejemplo, la aplicación corre como usuario newuser y escribe los logs en /home/newuser/logs/. Crea un archivo de configuración local:
nano /home/newuser/logrotate.conf
/home/newuser/logs/*.log {
hourly
missingok
rotate 24
compress
create
}
Esta configuración rotará los logs cada hora, conservando 24 archivos comprimidos y creando un nuevo archivo de log cada vez.
Crea el directorio de logs y un archivo de prueba:
cd ~
mkdir logs
touch logs/access.log
Ejecuta logrotate manualmente indicándole un archivo de estado personalizado:
logrotate /home/newuser/logrotate.conf --state /home/newuser/logrotate-state --verbose --force
Salida:
reading config file /home/newuser/logrotate.conf
Handling 1 logs
rotating pattern: /home/newuser/logs/*.log hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/newuser/logs/access.log
log does not need rotating
--verboseimprime un informe detallado de todo lo que hace logrotate.--forcefuerza la rotación independientemente de si toca o no según la planificación.--stateindica a logrotate dónde almacenar el registro de la última ejecución.
Comprueba el contenido del archivo de estado:
cat /home/newuser/logrotate-state
Salida:
logrotate state -- version 2
"/home/newuser/logs/access.log" 2020-05-18-16:0:0
Así es como logrotate registra qué logs ha procesado y cuándo — para saber exactamente qué hacer en la siguiente ejecución. Ejecuta el mismo comando una hora después y el log se rotará como se espera.
Automatizar con cron
Para que logrotate se ejecute automáticamente cada hora, añade un job de cron:
crontab -e
Añade esta línea al final del archivo:
14 * * * * /usr/sbin/logrotate /home/newuser/logrotate.conf --state /home/newuser/logrotate-state
Esta tarea se ejecutará en el minuto 14 de cada hora, todos los días.
Ayuda
¿Tienes dudas o necesitas ayuda? Escríbenos a través del sistema de tickets — siempre estamos aquí para ayudarte!