sábado, 25 de diciembre de 2021

Logrotate: administra los registros (logs) de tu sistema Linux

En el mundo de los sistemas UNIX y GNU/Linux tiene un buen puñado de herramientas increíbles, que facilitan el día a día de las personas administradoras de sistemas. Una de ellas es logrotate. Esta utilidad implementa una variedad de políticas de administración de registros y es estándar en todas las distribuciones GNU/Linux. También se puede instalar, si así se desea, en sistemas Solaris, HP-UX o AIX





Administra todos los registros de tu sistema con logrotate: comprime, borra, guarda

Logrotate está diseñado para facilitar la administración de sistemas que generan una gran cantidad de archivos de registro. Permite auto rotación, compresión, borrado y envío de archivos de registro por correo. Además podemos manejar cada archivo de registro de manera diaria, semanal, mensual o cuando crece más de un tamaño dado.

Normalmente, logrotate se ejecuta como un trabajo cron diario. No modificará un registro más de una vez en un día, a menos que el criterio para ese registro se base en el tamaño del fichero de registro y logrotate este configurado para ejecutarse más de una vez al día.

Sobre los ficheros de configuración

  • /etc/logrotate.conf: Este archivo contiene algunas configuraciones predeterminadas y configura la rotación para algunos logs que no son propiedad de ningún paquete del sistema. Ademas utiliza una sentencia include para obtener la configuración de cualquier archivo que se encuentre en el directorio /etc/logrotate.d.
  • /etc/logrotate.d/: Aquí se van a colocar las configuraciones de Logrotate para cualquier paquete que instales en tu servidor que requiera de ayuda para rotar sus logs. En una instalación estándar deberías tener estos archivos aquí para sistemas básicos como apt, dpkg, rsyslog y más.

 

Los ficheros de configuración están ubicados dentro de la ruta /etc/logrotate.d y constan de una serie de especificaciones para los grupos de archivos de registros que se van a administrar. Existen muchos parámetros que se pueden utilizar, como errors,rotate o weekly, pero hay muchos más. Aquí tenéis un ejemplo del aspecto de una configuración para el servicio samba:

/var/log/samba/*.log {
     notifyempty
     copytruncate
     sharedscripts
     postrotate
          /bin/kill -HUP `cat /var/lock/samba/*.pid`
     endscript
}

Además, existe un fichero de configuración global, en la ruta /etc/logrotate.conf. Modificando sus parámetros indicaremos a logrotate como ha de funcionar. Por norma general, en un sistema operativo Centos 7, tendremos la siguiente información:

# see "man logrotate" for details
# rotate log files weekly
weekly
 
# keep 4 weeks worth of backlogs
rotate 4
 
# create new (empty) log files after rotating old ones
create
 
# use date as a suffix of the rotated file
dateext
 
# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
 
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}
 
/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}
 
# system-specific logs may be also be configured here.

Veamos una lista de los parámetros que podemos utilizar, para así comprender que hace cada cosa:

  • compress – Indica que comprimirá todas las versiones, menos la que está en funcionamiento.
  • daily, weekly, monthly – Rotará los archivos de registro en la programación especificada.
  • delaycompress – Comprime todas las versiones, menos la actual y la siguiente más reciente.
  • endscript – Marca el final de un prerotate o postrotate script.
  • errors «emailaddr» – Notifica por correo los errores a la dirección especificada.
  • missingok – El sistema no se queja si el fichero no existe.
  • notifyempty – No se procede al rotado si el fichero está vacío.
  • olddir «dir» – Especifica la ubicación donde se guardarán las versiones antiguas de log.
  • postrotate – Introduce a un script que se ejecutará después de que el log haya rotado.
  • prerotate – Introduce a un script que se ejecutará antes de cualquier cambio haya ocurrido.
  • rotate «n» – Número de versiones del log en el esquema de la rotación.
  • sharedscripts – Ejecuta un script sólo una vez para todo el grupo de registro.
  • size «logsize» – Se procede al rotado si el tamaño del fichero de log supera un tamaño. Por ejemplo size > tamaño (p.e. 100K, 4M)

Para el tema que envíe notificaciones por correo, en nuestro sistema debemos tener un servicio de envío de correo instalado, como por ejemplo Postfix o Sendmail

Personaliza el formato europeo fecha:

# formato europeo fecha

dateformat %d-%m-%Y

Queremos rotar un determinado log de apache, en el momento que llegue a los 150Mb, para ello, iriamos a nuestro fichero de configuración para el logrotate de apache (/etc/logrotate.d/apache por ejemplo):

Ejemplo

/usr/local/apache/logs/access_log { compress maxage 360 size=+150M create 644 root root postrotate /etc/init.d/apache2 reload endscript }

Falta comentar que lógicamente, logrotate debe ir configurado en un cron para que se ejecute periódicamente, no obstante por defecto ya viene asignado, en caso de querer lanzarlo manualmente para probar si está correctamente configurado se hace del siguiente modo:

Especificamos el fichero de configuración (en este caso /etc/logrotate.conf), y forzamos con -f. 

logrotate /etc/logrotate.conf -f

 

Comprobar tus archivos de configuración

Una vez definido tu archivo de configuración, es interesante probarlo. De esta manera te evitarás la desagradable sorpresa que no funcione como te esperas. O lo que es mas grave, que por una mala configuración has perdido toda la información de los últimos meses. Una auténtica catástrofe.

Para probar estos archivos de configuración ejecuta la siguiente instrucción,

sudo logrotate /etc/logrotate.conf --debug

Dividir o partir un fichero por tamaño

Creamos un fichero de prueba

Utilizaremos el comando dd para crear un fichero de 6 MB que nos sirva como ejemplo. Si tenéis a mano un log de considerable tamaño, podéis hacer uso de él para este caso.


dd if=/dev/zero of=ficherocompleto bs=1024 count=0 seek=$[1024*6]

Dividimos el fichero por bytes

Vamos a dividir en 3 ficheros de 2 MB cada uno con el comando split («split a file into pieces», tal y como lo describen en su ficha man):

split -b 2m ficherocompleto ficheroparcial


Comprobamos con ls -lrht que efectivamente hemos “troceado” nuestro fichero inicial en 3 parciales de 2 MB cada uno:


-rw-rw-r-- 1 jota jota 2,0M jul 26 12:50 ficheroparcialac
-rw-rw-r-- 1 jota jota 2,0M jul 26 12:50 ficheroparcialab
-rw-rw-r-- 1 jota jota 2,0M jul 26 12:50 ficheroparcialaa

Partir un fichero por número de líneas

Recomendable para analizar logs de gran cantidad de líneas. Veamos las líneas de un fichero de log de Jboss con wc -l server.log, obteniendo:


218524 server.log

218524 líneas en total. Vamos a fragmentarlo en ficheros de 100000 líneas cada uno. Si no especificamos el nombre del fichero parcial de destino, entonces el comando split crea por defecto los ficheros empezando por xaa y siguiendo el abecedario (xab, xac, etc …):


split -l 100000 server.log

Comprobamos con wc -l xa*:


100000 xaa
100000 xab
18524 xac
218524 total

Si en vez de lo anterior quisiéramos dividir ese fichero inicial justo a la mitad de líneas, haríamos lo siguiente:


split -l `wc -l server.log | awk '{print $1 / 2}'` server.log

Comprobamos wc -l xa*:

109262 xaa
109262 xab
218524 total
 
Como véis no es nada difícil. De todas formas en el caso de los logs es buena idea tener buenas políticas de rotado (recomendable diariamente) para evitar que crezcan desmesuradamente. Por desgracia en servidores con gran carga de trabajo, independientemente de los rotados, nos encontramos muchas veces con logs bastante grandes… nada que no podamos superar echando mano de split

No hay comentarios:

Publicar un comentario