5. Logrotate

logrotate

Fichero de configuración: /etc/logrotate.conf


 

Dependiendo del número de usuarios y el tipo de servicios corriendo, los ficheros de log pueden crecer mucho y rápidamente. Para mantener el sistema libre de basura, se deben crear particiones separadas para /var o /var/log.
Además, existe software que revisa periódicamente los ficheros de logs de acuerdo a varios criterios, como puede ser el tamaño, y recorta o elimina viejos ficheros de log. El proceso es conocido como rotación (rotation), y el programa que lo realiza es logrotate.

Logrotate no es un demonio, si no que normalmente se ejecuta una vez al día utilizando un servicio como cron o similar.

Logrotate rechaza modificar ficheros de log más de una vez al día, excepto si la decisión depende del tamaño del fichero, se está utilizando un criterio horario o la opción –force.

El fichero /etc/logrotate.conf es solamente una convención puesta en marcha por una invoncación de /etc/cron.daily/logrotate (o similar). Posteriormente se procesan todos los ficheros en el directorio /etc/logrotate.d/, al cual se hace una llamada mediante include en el fichero inicial.

Logrotate revisa todos los ficheros que se le solicitan, no solamente aquellos creados por syslogd.

EJEMPLO:

/var/log/syslog
 {
 rotate 7
 mail nanana@batman.es
 daily
 missingok
 notifempty
 delaycompress
 compress
 postrotate
    invoke-rc.d rsyslog rotate >/dev/null
 endscript
 }

· /var/log/syslog: define qué fichero se debe revisar
Pueden enumerarse diversos ficheros o establecer criterios de búsqueda en shell (shell patterns).
Tras esto, entre los corchetes, se puede ver el bloque de directivas que aplicará logrotate.
Normalmente, los ficheros de configuración contienen directivas que están fuera de los corchetes. Éstas se aplican por defecto a todos los ficheros de log, a menos que haya directivas más específicas para dichos ficheros posteriormente entre corchetes.

· rotate 7: deben mantenerse 7 versiones del fichero de log. Si hay más, se eliminan.  Los ficheros rotados son numerados secuencialmente, es decir, si el fichero actual es /var/log/mail, el siguiente es /var/log/mail.1 y así hasta el último permitido.
Se pueden utilizar fechas en vez de números, con la directiva dateext. Los ficheros serían renombrados tal que var/log/syslog-20150719 (19/7/2015)
Usando este método, se puede controlar exactamente cómo se verá el nombre del archivo mediante %Y, %m, %d y %s.
Utilizando dateformat, logrotate ordena los ficheros léxicamente para encontrar el más antiguo. Esto funciona con -%Y%m%d y -%d%m%Y

· mail nanana@batman.es: si se especifica una dirección de correo con ‘mail’, los ficheros no se eliminarán si no que se enviarán a la dirección de email.

· daily: significa que los ficheros deben rotar diariamente.
Existen además hourly, weekly, monthly y yearly.
Weekly realiza la rotación el primer día de la semana en el sistema inglés, el domingo, o si el equipo ha estado apagado, cuando puede siempre que haya transcurrido dicha semana.
Monthly, se rotan los ficheros en la primera ejecución mensual de logrotate.
Yearly realiza la rotación a principios de año.
Hourly presenta el problema de que por defecto, logrotate se ejecuta una vez al día, por lo que se debe buscar la forma de cambiar el período de ejecución.
Un criterio alternativo es size. Rotará el fichero de log cuando exceda un tamaño X definido. Estos tamaños se definen en bytes por defecto, o con K para Kibibytes, M para Mibibytes y G para Gibibytes.
Se pueden utilizar a la vez time y size. Se hace utilizando maxsize, en este caso el fichero se rota al llegar al tamaño máximo incluso si la fecha especificada no ha llegado o minsize, en cuyo caso el fichero solamente será rotado en la fecha especificada si ha excedido el tamaño dado, los ficheros con menor tamaño serán saltados

· missingok: suprime los mensajes de error si un log no es encontrado
La configuración por defecto es nomissingok

· notifempty: no rota los logs si el fichero está vacío. Por defecto se utiliza ifempty, que sí los rota.

· delaycompress: asegura que una rotación realizada recientemente no es comprimida, solamente las que se realizan en rotaciones posteriores, por lo que la secuencia de ficheros se vería tal que así:

history.log  history.log.1  history.log.2.gz  term.log  term.log.1.gz  term.log.2.gz

mientras que por defecto se realiza lo siguiente:

history.log  history.log.1.gz  history.log.2.gz  term.log  term.log.1.gz  term.log.2.gz

Esto se utiliza si hay alguna posibilidad de que, por ejemplo, rsyslog necesite añadir información al fichero despues de haber sido renombrado. Esto puede suceder porque rsyslog mantiene el fichero abierto, y renombrarlo es irrelevante mientras se está escribiend en él.

· compress: permite que los ficheros rotados sean comprimidos. Se realiza por defecto con gzip, a menos que se utilice un método alternativo con compresscmd. Las opciones que deberá utilizar para comprimir (las que se pueden utilizar en línea de comandos) se definen con compressoptions. Por defecto se utiliza -6.

· postrotate: avisa a rsyslog de que hay un nuevo fichero de logs.

· invoke-rc.d rsyslog rotate >/dev/null: Los comandos del shell son ejecutados por logrotate una vez el fichero de log ha sido rotado.
El comando en sí es irrelevante (este es el que utiliza Debian), la idea es que se envíe una señal SIGHUP al programa que está manejando los logs, de forma que se reinicie y relea el fichero de configuración, otras distribuciones tienen métodos diferentes.

Entre postrotate y endscript puede haber varias líneas con scripts que logrotate concatena y las pasa al intérprete por defecto, /bin/sh como un conjunto. El comando pasa el nombre del fichero de log como parámetro, por lo que se puede utilizar la forma $1.

Los comandos a continuación de postrotate son ejecutados una vez por cada fichero de log enumerado al inicio del bloque de configuración. Se puede utilizar la directiva sharedscripts para garantizar que los comandos son ejecutados, como mucho, una vez para los ficheros que coinciden con el patrón, o ninguna, si no necesitan ser rotados.

Se puede utilizar create para asegurarse que el fichero de log es creado automáticamente después que los comandos son ejecutados. Utiliza el nombre del fichero antiguo, se pueden definir de 3 formas diferentes:

create 600 root adm         Con permisos, propietario y grupo
create root adm             Con propietario y grupo
create                      Sin nada

Si no se espefican ningún parámetro, todas las propiedades son tomadas del fichero anterior. Toda la documentación en logrotate(8).

Deja un comentario