LINUX

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

logrotate ubuntu

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 controlan, los archivos de registro pueden crecer hasta consumir todo el espacio de partición disponible en el que residen. Para evitar que los archivos de registro se llenen por completo, los mensajes de registro se pueden rotar, lo que significa que cuando se alcanza un cierto umbral, el archivo de registro antiguo se cierra y se abre uno nuevo.

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

¿Qué es la rotación de registros?

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 usar nuevos archivos de registro. Por lo general, se ejecuta automáticamente a través de crónicamente utilidad. Con la rotación de registros, puede

  • iniciar un nuevo archivo de registro de acuerdo con un cronograma, como diario, semanal o mensual
  • comprimir archivos de registro antiguos para ahorrar espacio en disco
  • recorte 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 registros más antiguos.
  • ejecutar comandos antes o después de rotar un conjunto de registros.

Puede ver la rotación de registros como un proceso que cambia el nombre de un archivo de registro actual y establece un nuevo archivo de registro para las nuevas entradas de registro. Cuando se rota un archivo de registro, el archivo de registro anterior generalmente se copia en un archivo que tiene la fecha de rotación.

1) Archivos de configuración Logrotate

En Ubuntu 18.04, los archivos de configuración de logrotate son /etc/logrotate.confjunto con cualquier archivo de /etc/logrotate.dEl principal logrotate.conf El archivo especifica todas las configuraciones predeterminadas y los archivos del sistema que se van a rotar. El archivo contiene algunas opciones que están bien explicadas por 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 usted está:

  • semanalmente: rotar los archivos de registro una vez a la semana
  • su syslog raíz: archivará los registros usando el usuario especificado (raíz) y grupo (registro del sistema) para evitar problemas con los permisos
  • girar 4: asegura 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 nuevo nombre y se crea un nuevo archivo
  • comprimir: compress hace que logrotate comprima los archivos de registro para ahorrar espacio. Esto se hace usando gzip por defecto, pero puedes especificar otro programa
  • incluye: Esta importante opción asegura que el contenido del directorio /etc/logrotate.d Está incluido. En este directorio, hay archivos que especifican cómo manejar archivos de registro individuales.

Cada archivo en el /etc/logrotate.d se utiliza para agregar configuraciones adicionales o anular la configuración predeterminada para ciertos archivos. La carpeta también contiene la configuración logrotate de cualquier paquete que instale que requiera 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

Puede ver, por ejemplo, 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 puedes ver arriba:

  • diariamente: rotar registro por día base
  • perdido: No arrojar un error si falta el registro
  • compresión de retraso: No comprima el archivo hasta que ya haya sido rotado. Esto es para evitar la corrupción si el daemon no cierra inmediatamente el archivo de registro.
  • notificación vacía: No gire el archivo de registro cuando esté vacío
  • crear adm raíz 640: esto creará nuevos archivos de registro con permisos, propietario y conjunto de grupos
  • guiones compartidos: Si el comodín coincide con varios archivos, ejecute cualquier secuencia de comandos una vez para todos los archivos
  • posrotación/escrito final: Especifica algunos comandos o scripts que deben ser ejecutados por guion final palabra clave, después de que se hayan rotado los registros.
  • prerrotar/escribir final: como posrotación/escrito finalespecifica los comandos o scripts que deben ejecutarse antes de iniciar la rotación de registros.

Puede obtener información sobre opciones adicionales utilizando el manual

man logrotate

2) Configurar la rotación de registros con logrotate

El comando logrotate generalmente 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 registros, el archivo de registro más antiguo se eliminará automáticamente.

Normalmente, el comando logrotate se instala de forma predeterminada en 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 al ejecutar el 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 logrotate de la aplicación si se ejecuta con -d parámetro de 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 raíz y como usuario no raíz.

a) Configurar logrotation para paquetes de servidor instalados

Los archivos de configuración Logrotate como usuario raíz se crean en /etc/logrotate.d carpeta diaria. Por ejemplo, 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 apuntaremos al 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 alain@linoxide.com
}

Vamos a explicar algunas opciones:

  • texto de fecha: use la fecha como extensión para versiones anteriores de archivos de registro
  • Talla: archivos de registro que crecen más que el tamaño especificado aquí
  • Correo: para indicar a logrota que envíe su contenido por correo electrónico a la dirección especificada antes de sobrescribirlo. Debe tener un servidor de correo en funcionamiento.

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á alguna información, pero la ordenaremos solo 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 alain@linoxide.com
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 rotación. Esto se debe a que aún no se ha verificado el tamaño de la condición. 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 aplicaciones personalizadas

Puede configurar la rotación de registros para aplicaciones personalizadas que generan registros y se ejecutan como usuarios 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 ejemplo configurando la rotación de registros para discord. Crearemos una carpeta personal que contendrá el archivo de configuración principal de logrotate y una carpeta para los archivos de registro. Esta aplicación no comprende la rotación de registros, por lo que logrotate manejará esto usando una implementación de copia y truncado

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

Usé nuevas opciones copia truncada que trunca el archivo de registro anterior 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 indicar que cierren 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ó, por lo que sabe qué hacer la próxima vez que se ejecute. Tenga en cuenta que estamos ejecutando el comando como un 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 prueba el mismo comando después de unas horas, es posible que vea información adicional en la salida, como 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 alain@linoxide.com
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

Tenga en cuenta que una configuración logrotate se define mediante un archivo global que coincide con los archivos de registro, seguido de una serie de declaraciones encerradas 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; se han ido, por lo que debe considerar tomar medidas.

Lea también:

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar