Cómo gestionar archivos de registro con Logrotate en Ubuntu 22.04

Introducción

Logrotate es una utilidad del sistema que gestiona la rotación automática y compresión de archivos de registro. Si los archivos de registro no se rotan, comprimen y podan periódicamente, podrían consumir eventualmente todo el espacio en disco disponible en un sistema.

Logrotate se instala de forma predeterminada en Ubuntu 22.04 y está configurado para manejar las necesidades de rotación de registros de todos los paquetes instalados, incluido rsyslog, el procesador de registros del sistema predeterminado.

En este artículo, exploraremos la configuración predeterminada de Logrotate, luego configuraremos la rotación de registros para una aplicación personalizada ficticia.

Prerrequisitos

Este tutorial asume que tienes un servidor Ubuntu 22.04, con un usuario no root habilitado para sudo, como se describe en Configuración Inicial del Servidor con Ubuntu 22.04.

Logrotate también está disponible en muchas otras distribuciones de Linux, pero la configuración predeterminada puede ser bastante diferente. Las otras secciones de este tutorial seguirán siendo aplicables siempre que tu versión de Logrotate sea similar a la de Ubuntu 22.04. Sigue el Paso 1 para determinar la versión de Logrotate que tienes.

Inicia sesión en tu servidor como usuario habilitado para sudo para comenzar.

Paso 1 — Confirmar la versión de Logrotate

Logrotate se instala de forma predeterminada en Ubuntu. Sin embargo, si necesitas instalarlo, ejecuta los siguientes comandos para actualizar tu lista de paquetes y obtener el paquete:

  1. sudo apt update
  2. sudo apt install logrotate

Si estás utilizando un servidor que no es de Ubuntu, primero asegúrate de que Logrotate esté instalado solicitando información sobre su versión:

  1. logrotate --version
Output
logrotate 3.19.0 Default mail command: /usr/bin/mail Default compress command: /bin/gzip Default uncompress command: /bin/gunzip Default compress extension: .gz Default state file path: /var/lib/logrotate/status ACL support: yes SELinux support: yes

Si Logrotate está instalado pero el número de versión es significativamente diferente, es posible que tengas problemas con algunas de las opciones de configuración que se exploran en este tutorial. Consulta la documentación de tu versión específica de Logrotate leyendo su página manual (man):

  1. man logrotate

También puedes consultar la versión en línea de la documentación de Logrotate. A continuación, veremos la estructura de configuración predeterminada de Logrotate en Ubuntu.

Paso 2 — Explorando la Configuración de Logrotate

La información de configuración de Logrotate generalmente se puede encontrar en dos lugares en Ubuntu:

  • /etc/logrotate.conf: este archivo contiene algunas configuraciones predeterminadas y establece la rotación para algunos registros que no son propiedad de ningún paquete del sistema. También utiliza una declaración include para incorporar configuración desde cualquier archivo en el directorio /etc/logrotate.d.
  • /etc/logrotate.d/: aquí es donde cualquier paquete que instales que necesite ayuda con la rotación de registros colocará su configuración de Logrotate. En una instalación estándar, ya deberías tener archivos aquí para herramientas básicas del sistema como apt, dpkg, rsyslog y así sucesivamente.

De manera predeterminada, logrotate.conf configurará rotaciones de registros semanales, con archivos de registro propiedad del usuario root y el grupo syslog, con cuatro archivos de registro retenidos a la vez (rotate 4), y se crearán nuevos archivos de registro vacíos después de que se haya rotado el actual (create).

Vamos a echar un vistazo al archivo de configuración de Logrotate de un paquete en /etc/logrotate.d. Lee el archivo para la utilidad del paquete apt:

  1. cat /etc/logrotate.d/apt
Output
/var/log/apt/term.log { rotate 12 monthly compress missingok notifempty } /var/log/apt/history.log { rotate 12 monthly compress missingok notifempty }

Este archivo contiene bloques de configuración para dos archivos de registro diferentes en el directorio /var/log/apt/: term.log y history.log. Ambos tienen las mismas opciones. Cualquier opción no establecida en estos bloques de configuración heredará los valores predeterminados o aquellos establecidos en /etc/logrotate.conf. Cualquier configuración en un archivo de Logrotate anulará los valores predeterminados de Logrotate, que están configurados en /etc/logrotate.conf. Las opciones establecidas para los registros de apt son:

  • rotate 12: mantener doce archivos de registro antiguos. Esto anula la configuración predeterminada de rotate 4.
  • monthly: rotar una vez al mes. Esto anula la configuración predeterminada de weekly.
  • compress: comprimir los archivos rotados. Esto utiliza gzip de manera predeterminada y resulta en archivos que terminan en .gz. El comando de compresión puede cambiarse utilizando la opción compresscmd.
  • missingok: no mostrar un mensaje de error si falta el archivo de registro.
  • notifempty: no rotar el archivo de registro si está vacío.

Estos archivos de configuración también heredan el comportamiento predeterminado de create, que instruye a Logrotate a crear nuevos registros después de la rotación. Esto podría anularse con nocreate, aunque eso efectivamente desactivaría la mayoría de las otras funcionalidades.

Hay muchas más opciones de configuración disponibles. Puedes leer sobre todas ellas escribiendo man logrotate en la línea de comandos para abrir la página del manual de Logrotate.

A continuación, configuraremos un archivo de configuración para manejar registros de un servicio ficticio llamado tu-aplicacion.

Paso 3 — Configurar un Ejemplo de Configuración

Para administrar archivos de registro utilizando logrotate para aplicaciones fuera de los servicios del sistema preempaquetados y preconfigurados, tenemos dos opciones:

  1. Cree un nuevo archivo de configuración de Logrotate y colóquelo en /etc/logrotate.d/. Esto se ejecutará diariamente como el usuario root junto con todos los demás trabajos estándar de Logrotate.
  2. Cree un nuevo archivo de configuración y ejecútelo fuera de la configuración predeterminada de Logrotate de Ubuntu. Esto solo es realmente necesario si necesita ejecutar Logrotate como un usuario no root, o si desea rotar los registros con más frecuencia que diariamente (una configuración hourly en /etc/logrotate.d/ sería ineficaz, porque la configuración de Logrotate del sistema se ejecuta solo una vez al día).

Veamos estas dos opciones con algunos ejemplos de configuración.

Agregando Configuración a /etc/logrotate.d/

Queremos configurar la rotación de registros para un servidor web ficticio que coloca un access.log y error.log en /var/log/your-app/. Se ejecuta como el usuario y grupo www-data.

Para agregar una configuración para los archivos de registro de your-app a /etc/logrotate.d/, primero abra un nuevo archivo en el directorio /etc/logrotate.d usando nano o su editor preferido:

  1. sudo nano /etc/logrotate.d/your-app

Agregue las siguientes líneas a su nuevo archivo de configuración:

/etc/logrotate.d/your-app
/var/log/your-app/*.log {
	daily
	missingok
	rotate 14
	compress
	notifempty
	create 0640 www-data www-data
	sharedscripts
	postrotate
		systemctl reload your-app
	endscript
}

Algunas de las nuevas directivas de configuración en este archivo son:

  • create 0640 www-data www-data: esto crea un nuevo archivo de registro vacío después de la rotación, con los permisos especificados (0640), propietario (www-data), y grupo (también www-data).
  • sharedscripts: esta bandera significa que cualquier script agregado a la configuración se ejecuta solo una vez por ejecución, en lugar de por cada archivo rotado. Dado que la ruta /var/log/your-app/*.log incluye un comodín *, esta configuración coincidiría con cualquier cantidad de archivos de registro en el directorio your-app. Sin la opción sharedscripts, el script especificado en postrotate se ejecutaría cada vez que logrotate procese un archivo de registro sin esta opción.
  • postrotate a endscript: este bloque contiene un script para ejecutar después de que el archivo de registro se haya rotado. En este caso, estamos recargando nuestro ejemplo de aplicación. A veces es necesario hacer esto para que su aplicación cambie al archivo de registro recién creado.
    Tenga en cuenta que postrotate se ejecuta antes de que se compriman los registros. La compresión podría llevar mucho tiempo, y su software debería cambiar inmediatamente al nuevo archivo de registro. Para tareas que necesiten ejecutarse después de que se compriman los registros, use el bloque lastaction en su lugar.

Para guardar y salir de nano, presione Ctrl+X, y cuando se le solicite, Y y luego Enter. Puede probar el archivo de configuración haciendo una ejecución en seco:

  1. sudo logrotate /etc/logrotate.conf --debug

Este comando llama a logrotate, lo apunta al archivo de configuración estándar, y activa el modo de depuración.

Se imprimirá información sobre qué archivos de registro está manejando Logrotate y qué haría con ellos. Si todo parece estar bien, has terminado. El trabajo estándar de Logrotate se ejecutará una vez al día e incluirá tu nueva configuración.

A continuación, intentaremos una configuración que no utilice la configuración predeterminada de Ubuntu en absoluto.

Paso 4: Creación de una Configuración Independiente de Logrotate

En este ejemplo, tenemos una aplicación que se ejecuta como nuestro usuario sammy, generando registros que se almacenan en /home/sammy/logs/. Queremos rotar estos registros por hora, así que necesitamos configurarlo fuera de la estructura /etc/logrotate.d proporcionada por Ubuntu.

Primero, crearemos un archivo de configuración en nuestro directorio personal. Ábrelo en un editor de texto:

  1. nano /home/sammy/logrotate.conf

Luego, pega la siguiente configuración:

/home/sammy/logrotate.conf
/home/sammy/logs/*.log {
	hourly
	missingok
	rotate 24
	compress
	create
}

Guarda y cierra el archivo. Hemos encontrado todas estas opciones en pasos anteriores, pero resumamos: esta configuración rotará los archivos por hora, comprimiendo y conservando veinticuatro registros antiguos y creando un nuevo archivo de registro para reemplazar al rotado.

Necesitarás personalizar la configuración para adaptarla a tu aplicación, pero este es un buen punto de partida.

Para probar que la configuración funciona, creemos un archivo de registro. Primero cd a el directorio de inicio de tu usuario usando el comando cd ~. Luego crea un directorio para los registros usando el comando mkdir. Finalmente, crea un archivo vacío en el directorio logs usando el comando touch. Ejecuta los siguientes comandos para completar estos pasos:

  1. cd ~
  2. mkdir logs
  3. touch logs/access.log

Ahora que tenemos un archivo de registro en blanco en el lugar correcto, ejecutemos el comando logrotate.

Como los registros son propiedad de sammy no necesitamos usar sudo. Sin embargo, necesitamos especificar un archivo de estado. Este archivo registra lo que logrotate encontró y cualquier acción que tomó la última vez que se ejecutó, para que sepa qué hacer la próxima vez que se ejecute. Este seguimiento de estado se maneja para nosotros cuando usamos la configuración predeterminada de /etc/logrotate.conf. El archivo de estado se almacena en /var/lib/logrotate/status. Dado que no estamos usando la configuración predeterminada, deberemos configurar la ubicación del archivo de estado manualmente.

Haremos que Logrotate coloque el archivo de estado justo en nuestro directorio de inicio para este ejemplo. Puede estar en cualquier lugar que sea accesible y conveniente. Ejecuta el siguiente comando para usar el /home/sammy/logrotate.conf que creaste y para registrar el estado que encuentre logrotate:

logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Output
reading config file /home/sammy/logrotate.conf Handling 1 logs rotating pattern: /home/sammy/logs/*.log hourly (24 rotations) empty log files are rotated, old logs are removed considering log /home/sammy/logs/access.log log does not need rotating

La bandera --verbose imprimirá información detallada sobre lo que Logrotate está haciendo. En este caso, no rotó nada. Es la primera vez que Logrotate encuentra este archivo de registro y tiene cero horas de antigüedad, por lo que no debería ser rotado.

Si examinamos el archivo de estado usando la utilidad cat, notaremos que Logrotate registró alguna información sobre la ejecución:

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2022-07-2-19:0:0

Logrotate registró los registros que observó y cuándo los consideró por última vez para la rotación. Si ejecutamos este mismo comando una hora más tarde, el registro se rotará como se esperaba.

Si deseas forzar a Logrotate a rotar el archivo de registro cuando de otra manera no lo haría, utiliza la bandera --force:

  1. logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

Esto es útil cuando se están probando scripts de postrotate y otros.

Finalmente, necesitamos configurar una tarea cron para ejecutar Logrotate cada hora. Abre el crontab de tu usuario:

  1. crontab -e

Esto abrirá un archivo de texto. Si es la primera vez que usas cron, es posible que se te pida elegir un editor de texto predeterminado. Si no tienes preferencia, te recomendamos nano para nuevos usuarios. Puede haber algunos comentarios ya en el archivo que expliquen la sintaxis de cron. Mueve el cursor hacia abajo a una nueva línea en blanco al final del archivo y agrega lo siguiente:

crontab
14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

Esta tarea se ejecutará en el minuto 14 de cada hora, todos los días. Ejecuta prácticamente el mismo comando logrotate que ejecutamos anteriormente, aunque expandimos logrotate a su ruta completa de /usr/sbin/logrotate para estar seguros. Es una buena práctica utilizar rutas completas al escribir tareas cron. Para obtener más información sobre cron, puedes revisar nuestros otros tutoriales.

Guarda el archivo y sal. Esto instalará el crontab y nuestra tarea se ejecutará según el horario especificado.

Si volvemos a visitar nuestro directorio de registros en aproximadamente una hora, deberíamos encontrar el archivo de registro rotado y comprimido access.log.1.gz (o .2.gz si ejecutaste Logrotate con la bandera --force).

Conclusión

En este tutorial verificamos nuestra versión de Logrotate, exploramos la configuración predeterminada de Logrotate en Ubuntu y configuramos dos tipos diferentes de configuraciones personalizadas. Para obtener más información sobre las opciones de línea de comandos y configuración disponibles para Logrotate, puedes leer su página de manual ejecutando man logrotate en tu terminal o visitando la documentación en línea.

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-22-04