Cómo configurar la rotación de registros con Logrotate en Ubuntu 18.04 / 20.04

Los archivos de registro están destinados a retener información sobre las actividades del sistema durante un período de tiempo razonable, pero los demonios de registro del sistema no proporcionan ningún medio para controlar el tamaño de los archivos de registro. Si no se selecciona, los archivos de registro pueden, por lo tanto, crecer hasta consumir todo el espacio de partición disponible en el que residen. Para evitar que los archivos de registro llenen su sistema por completo, los mensajes de registro se pueden rotar, lo que significa que cuando se alcanza un cierto umbral, el archivo de registro anterior se cierra y se abre un nuevo archivo de registro.

Aquí le mostraré cómo rotar los archivos de registro con logrotate en Ubuntu 18.04 / 20.04.

¿Qué es la rotación de troncos?

La rotación de registros es un proceso que resuelve estos problemas archivando periódicamente el archivo de registro actual e iniciando uno nuevo. Cambia el nombre y, opcionalmente, comprime los archivos de registro actuales, elimina los archivos de registro antiguos y obliga al sistema de registro a comenzar a utilizar nuevos archivos de registro. Por lo general, se ejecuta automáticamente a través de la utilidad cron. Con la rotación de troncos, puede

  • iniciar un nuevo archivo de registro en un horario, como diario, semanal o mensual
  • comprimir archivos de registro antiguos para ahorrar espacio en disco
  • pode los archivos antiguos para que solo conserve una cierta cantidad de registros antiguos.
  • cambie el nombre de los archivos de registro antiguos con un sello de fecha para que sepa dónde buscar los registros más antiguos.
  • ejecutar comandos antes o después de rotar un conjunto de registros.

Puede ver la rotación de registros como el proceso que cambia el nombre de un archivo de registro actual y configura un nuevo archivo de registro para nuevas entradas de registro. Cuando se gira un archivo de registro, el archivo de registro antiguo generalmente se copia a un archivo que tiene la fecha de rotación en él.

1) Los archivos de configuración de logrotate

En Ubuntu 18.04, los archivos de configuración de logrotate son /etc/logrotate.conf, junto con los archivos en /etc/logrotate.dEl archivo logrotate.conf principal especifica cualquier configuración predeterminada y archivos de sistema que se rotarán. El archivo contiene algunas opciones que se explican bien en los comentarios.

cat /etc/logrotate.conf 
# see "man logrotate" for details
# rotate log files weekly
weekly

# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

# system-specific logs may be configured here

Las principales opciones de logrotate son:

  • semanalmente: rota los archivos de registro una vez a la semana
  • su root syslog: archivará los registros utilizando el usuario específico (raíz) y el grupo (syslog) para evitar problemas con los permisos
  • rotar 4: se asegura de que se guarden cuatro versiones antiguas del archivo. Gira un registro determinado cuatro veces antes de eliminarlo, por lo que mantiene cuatro semanas de registros en línea.
  • crear: El archivo antiguo se guarda con un nombre nuevo y se crea un archivo nuevo
  • comprimir: compress hace que logrotate comprima los archivos de registro para ahorrar espacio. Esto se hace usando gzip de forma predeterminada, pero puede especificar otro programa
  • incluir: Esta importante opción asegura que el contenido del directorio /etc/logrotate.d está incluido. En este directorio, existen archivos que especifican cómo manejar algunos archivos de registro individuales.

Cada archivo en /etc/logrotate.d se utiliza para agregar configuraciones adicionales o anular las configuraciones predeterminadas para archivos específicos. La carpeta también contiene la configuración de logrotate de cualquier paquete que instale que necesite rotación de registros

# ls -l /etc/logrotate.d
total 40
-rw-r--r-- 1 root root 120 Nov 2 2017 alternatives
-rw-r--r-- 1 root root 442 Oct 23 2017 apache2
-rw-r--r-- 1 root root 126 Nov 20 16:39 apport
-rw-r--r-- 1 root root 173 Apr 20 10:08 apt
-rw-r--r-- 1 root root 112 Nov 2 2017 dpkg
-rw-r--r-- 1 root root 146 Apr 17 17:35 lxd
-rw-r--r-- 1 root root 845 Jan 12 10:57 mysql-server
-rw-r--r-- 1 root root 501 Jan 14 16:19 rsyslog
-rw-r--r-- 1 root root 178 Aug 15 2017 ufw
-rw-r--r-- 1 root root 235 Apr 17 14:53 unattended-upgrades

Puedes ver por example la configuración de logrotate para el servidor web apache

# cat /etc/logrotate.d/apache2 
/var/log/apache2/*.log {
	daily
	missingok
	rotate 14
	compress
	delaycompress
	notifempty
	create 640 root adm
	sharedscripts
	postrotate
                if invoke-rc.d apache2 status > /dev/null 2>&1; then 
                    invoke-rc.d apache2 reload > /dev/null 2>&1; 
                fi;
	endscript
	prerotate
		if [ -d /etc/logrotate.d/httpd-prerotate ]; then 
			run-parts /etc/logrotate.d/httpd-prerotate; 
		fi; 
	endscript
}

Logrotate contiene algunas opciones adicionales que puede ver arriba:

  • a diario: rota el registro por día
  • missingok: No genere un error si falta el registro
  • delaycompress: No comprima el archivo hasta que ya se haya girado. Esto es para prevenir la corrupción si el demonio no lo hace. close el archivo de registro inmediatamente.
  • notifyempty: No gire el archivo de registro cuando esté vacío
  • crear 640 root adm: esto creará nuevos archivos de registro con permisos establecidos, propietario y grupo
  • guiones compartidos: Si el comodín coincide con varios archivos, ejecute cualquier script una vez para todos los archivos
  • postrotate / endcript: Especifica algunos comandos o secuencias de comandos que deben ejecutarse hasta la palabra clave final, después de que se rotaron los registros.
  • prerotate / endcript: como postrotate / endscript, especifica comandos o scripts que deben ejecutarse antes de que comience la rotación de registros.

Puede obtener información sobre las opciones adicionales utilizando el manual

man logrotate

2) Configurar la rotación de registros con logrotate

El comando logrotate normalmente cambia el nombre (o rota) los archivos de registro de forma cíclica; se cambiará el nombre del archivo de registro para que contenga una extensión numérica o de fecha, y se creará un nuevo archivo de registro para aceptar la información del sistema. Si logrotate está configurado para mantener solo dos copias de los archivos de registro antiguos, luego de dos rotaciones de registro, el archivo de registro más antiguo se eliminará automáticamente.

Normalmente, el comando logrotate se instala de forma predeterminada en su Ubuntu 18.04 y puede verificar la versión de la siguiente manera

# logrotate --version
logrotate 3.11.0

De forma predeterminada, logrotate se ejecuta a diario mediante la ejecución del script de shell /etc/cron.daily/logrotate Verá que los otros archivos cron no contienen ningún archivo logrotate

cat /etc/cron.daily/logrotate 
#!/bin/sh

# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
    [ -e "$logfile" ] && echo ""$logfile" $date"
done >> status.clean
mv status.clean status

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

Puede ver lo que haría la configuración de logrotate de la aplicación si se ejecuta con el -d parámetro del comando

# logrotate -d /etc/logrotate.d/mysql-server 
reading config file /etc/logrotate.d/mysql-server
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entries

Handling 1 logs

rotating pattern: /var/log/mysql.log /var/log/mysql/*log  after 1 days (7 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/mysql.log
error: skipping "/var/log/mysql.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
Creating new state
considering log /var/log/mysql/error.log
Creating new state
  Now: 2018-05-22 06:02
  Last rotated at 2018-05-22 06:00
  log does not need rotating (log has been already rotated)

Puede configurar la rotación de registros como usuario root y como usuario no root.

a) Configurar la rotación de registros para los paquetes de servidor instalados

Los archivos de configuración de Logrotate ya que el usuario root se crea en el /etc/logrotate.d carpeta a diario. Para example, configuraremos la rotación de registros para el supervisor de la herramienta de monitoreo. Primero, crearemos el archivo de rotación de registros en el que indicaremos el archivo de configuración que almacenará los registros.

# vim /etc/logrotate.d/supervisor
/var/log/supervisor/superviz.log {
        daily
        create 0640 root root
        missingok
        dateext
        rotate 3
        size=1M
        notifempty
        sharedscripts
        mail [email protected]
}

Expliquemos algunas opciones:

  • texto de datos: usa la fecha como extensión para versiones antiguas de los archivos de registro
  • Talla: registra archivos que crecen más que el tamaño especificado aquí
  • correo: para indicarle a logrotate que envíe su contenido por correo electrónico a la dirección especificada antes de sobrescribirlo. Debes tener un servidor de correo funcionando

Ahora podemos probar la configuración llamando a logrotate en modo de depuración que apunta a la configuración principal que contiene nuestra carpeta. El comando mostrará algo de información pero solo ordenaremos aquellos sobre nuestra configuración

# logrotate /etc/logrotate.conf --debug
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file alternatives
reading config file apache2
reading config file apport
reading config file apt
reading config file dpkg
reading config file lxd
reading config file mysql-server
reading config file rsyslog
reading config file supervisor
reading config file ufw
reading config file unattended-upgrades
Reading state from file: /var/lib/logrotate/status
...
...
rotating pattern: /var/log/supervisor/supervisord.log  1048576 bytes (3 rotations)
empty log files are not rotated, old logs mailed to [email protected]
switching euid to 0 and egid to 106
considering log /var/log/supervisor/supervisord.log
Creating new state
  Now: 2018-05-22 08:16
  Last rotated at 2018-05-22 08:00
  log does not need rotating (log size is below the 'size' threshold)
switching euid to 0 and egid to 0
....
....

Puede ver que nuestra configuración aún no necesita rotar. Esto se debe a que el tamaño de la condición aún no se ha verificado. Una vez que este comando se ejecuta sin errores, significa que la configuración se ve bien.

b) Configurar la rotación de registros para una aplicación personalizada

Puede configurar la rotación de registros para aplicaciones personalizadas que generan registros y se ejecutan como usuario no root. De forma predeterminada, logrotate se ejecuta a diario, por lo que, si necesitamos ejecutar nuestra aplicación cada hora, crearemos la configuración de logrotate fuera de la carpeta predeterminada.

Tomemos un example configurando la rotación de registros para la discordia. Crearemos una carpeta personal que contendrá el archivo de configuración de logrotate principal y una carpeta para los archivos de registro. Esta aplicación no comprende la rotación de registros, por lo que logrotate se encargará de esto mediante el uso de una implementación de copiar y truncar

$ vim apps/logrotate.conf
/home/alain/apps/logs/discord.log {
        hourly
        copytruncate
        missingok
        dateext
        rotate 10
        compress
}

Usamos nuevas opciones copiar que trunca el archivo de registro anterior en su lugar después de crear una copia, en lugar de mover el archivo anterior y crear uno nuevo. Esto es útil para los servicios a los que no se les puede pedir close sus archivos de registro.

Podemos probar nuestra configuración, pero necesitamos especificar un archivo de estado. Este archivo registra lo que logrotate vio e hizo la última vez que se ejecutó para que sepa qué hacer la próxima vez que se ejecute. Tenga en cuenta que ejecutamos el comando como usuario no root

$ logrotate /home/alain/apps/logrotate.conf --state /home/alain/apps/logrotate-state --verbose
reading config file /home/alain/apps/logrotate.conf
Reading state from file: /home/alain/apps/logrotate-state
Allocating hash table for state file, size 64 entries

Handling 1 logs

rotating pattern: /home/alain/apps/logs/discord.log  hourly (10 rotations)
empty log files are rotated, old logs are removed
considering log /home/alain/apps/logs/discord.log
Creating new state
  Now: 2018-05-22 10:09
  Last rotated at 2018-05-22 10:00
  log does not need rotating (log has been already rotated)

Si intenta el mismo comando después de unas horas, puede ver información adicional en la salida, como la información de truncamiento y compresión

logrotate /home/alain/apps/logrotate.conf --state /home/alain/apps/logrotate-state --verbose
reading config file /home/alain/apps/logrotate.conf
Reading state from file: /home/alain/apps/logrotate-state
Allocating hash table for state file, size 64 entries
Creating new state

Handling 1 logs

rotating pattern: /home/alain/apps/logs/discord.log  hourly (10 rotations)
empty log files are rotated, old logs mailed to [email protected]
considering log /home/alain/apps/logs/discord.log
  Now: 2018-05-22 22:52
  Last rotated at 2018-05-22 10:23
  log needs rotating
rotating log /home/alain/apps/logs/discord.log, log->rotateCount is 10
dateext suffix '-2018052222'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
copying /home/alain/apps/logs/discord.log to /home/alain/apps/logs/discord.log-2018052222
truncating /home/alain/apps/logs/discord.log
compressing log with: /bin/gzip

Debe conservar que una configuración de logrotate está definida por un archivo global que coincide con los archivos de registro, seguido de una serie de instrucciones incluidas entre llaves. Si no se especifica una opción en la estrofa adjunta al nombre del archivo de registro, la opción de nivel superior de /etc/logrotate.conf tiene prioridad. Los archivos de registro que se han rotado no se almacenan en ningún lugar; simplemente se han ido, por lo que debería pensar en tomar medidas.

Lea también:

  • Cómo verificar los registros cronológicos en Ubuntu 18.04
  • lnav: herramienta para ver y analizar archivos de registro desde la terminal de Linux
  • Cómo usar el comando systemd journalctl para administrar registros