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 antiguas
  • monthly — rotar una vez al mes
  • compress — comprimir los logs archivados (gzip por defecto)
  • missingok — no generar un error si el archivo de log no existe
  • notifempty — 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 permisos 0640, propiedad de www-data
  • sharedscripts — ejecutar el script postrotate una sola vez después de procesar todos los archivos coincidentes, en lugar de una vez por archivo
  • postrotate ... 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

HostingFunciona en discos NVMe ultrarrápidos. Apto para sitios web de cualquier complejidad.
Pedir
VPSParámetros ajustables y configuración flexible del SO. Administración gratuita incluida.
Pedir
Servidores dedicadosDisponibles diversas configuraciones Supermicro con procesadores Intel y AMD.
Pedir

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

--verbose imprime un informe detallado de todo lo que hace logrotate. --force fuerza la rotación independientemente de si toca o no según la planificación. --state indica 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!

¿Necesitas ayuda?Nuestros ingenieros te ayudarán gratuitamente con cualquier pregunta en minutosContáctanos