Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

jueves, 27 de agosto de 2015

Controlando la rotación de logs con logrotate

Uno del los aspectos más fundamentales a la hora de monitorizar un sistema o mantener un cierto control sobre éste, es el control de los ficheros de log del sistema... Estos ficheros son fundamentales en nuestro sistema, ya sea para solventar incidencias o para comprobar si algún fichero ha tenido algún comportamiento inesperado. Aunque la información de estos logs es muy importante, hay otro factor casi tan importante que dicha información: La gestión de éstos. Imaginemos que tenemos que gestionar todo tipo de mensajes de log, los cuales aparecen en distintos días... Aunque encontrar la información deseada sería posible, habría que recurrir al uso de múltiples grep con el fin de encontrar la aguja en el pajar... Es por ello que mediante el uso de logrotate, estos ficheros pueden aparecer mejor distribuidos y mejor clasificados, facilitando nuestras búsquedas y haciendo que tardemos muchísimo menos en encontrar lo que buscamos. Aunque logrotate ya tiene una serie de configuraciones por defecto, es muy interesante tener ciertas nociones sobre este concepto para poder personalizar nuestra gestión de logs y adaptarla a nuestras necesidades lo mejor posible; es por ello que en el post de hoy me centraré en las posibilidades que ofrece esta utilidad.


Logrotate se trata de un servicio que ya se encuentra por defecto instalado en el sistema operativo, con lo que no requiere de instalación alguna, pues ya los logs por defecto tienen cierta gestión establecida por defecto por este servicio para facilitar la vida al administrador del equipo o servidor. Esto significa que no habrá que recurrir a ningún método de instalación y podremos dirigirnos directamente a lo que nos incumbe: es decir a la configuración de éste.

Este servicio estaría distribuido en tres lugares distintos; cada uno de ellos con su propia relevancia y función, con lo que lo mejor sería analizar cada uno de éstos individualmente con el fin de tener una comprensión adecuada del conjunto:


Cron.daily

El primero y el que en un principio no sería necesario tocar, sería el fichero logrotate alojado en la ruta /etc/cron.daily/. Dicho fichero no sería necesario modificarlo ya que simplemente se trata de un script que es ejecutado diariamente; script cuya única función sería ejecutar la rotación de logs de acuerdo con lo establecido el fichero de configuración de logrotate que explicaré más adelante.


Fichero de configuración principal

El pilar central de la rotación de logs y el que determina la configuración que tendrán por defecto todos los logs almacenados en /var/log, a menos que especifique alguna configuración especifica a alguno de éstos. Este fichero está almacenado en /etc/ y su nombre es logrotate.conf y aquí es interesante analizar meticulosamente este fichero para entender como funciona esta utilidad. Es por ello que a continuación explicaré algunas las posibilidades que ofrece logrotate, que si bien no son todas (para ello es recomendable hacer uso de man) sí que son las más importantes y usadas:

1.Intervalo de rotación:

Este podría considerarse como uno de los parámetros más importantes dentro de este fichero, ya que establece cada cuanto se realiza la rotación... Aquí no hay prefijo alguno ni ninguna referencia sino que habría que optar por una de estas tres palabras, las cuales representarían que la rotación sería diaria, semanal o mensual respectivamente. El valor por defecto es weekly:

  1. daily
  2. weekly
  3. monthly

2.Número de rotaciones:

Casi tan importante como el parámetro anterior sería el número de rotaciones totales que admite el equipo... Esto es debido a que el equipo necesita establecer un número de rotaciones máximas, ya que cada rotación realizada hará que el log actual se sobrescriba con un nombre como por ejemplo nombrelog.1 y creará uno nuevo que almacenará los nuevos logs. Estableciendo un número de rotaciones determinadas determinaremos el número de logs antiguos que almacenaremos con el fin de que no desbordar el servidor de viejos logs. Por ejemplo si pusiésemos 4 rotaciones, tendríamos el fichero actual más 4 ficheros antiguos en los cuales el .1 sería el más nuevo y el .4 el más antiguo. Para establecer dicho límite se hace uso del parámetro rotate junto con el número de rotaciones, siendo 4 el número de rotaciones por defecto. Es decir que la línea encargada de esta tarea sería:

  1. rotate 4

3. Tamaño de logs

Se trata de un parámetro opcional que puede establecer el límite de tamaño máximo que deben tener los logs... Esto únicamente puede ser útil en equipos con poco espacio en el disco duro, pero aún así es interesante tener constancia de la existencia de esta utilidad... Para establecer un tamaño habría que recurrir al parámetro size, junto con el tamaño a especificar, el cual puede ser especificado en Kilobytes (K) Megabytes (M) o Gigabytes (G) sin impedimento alguno:

  1. size 100K
  2. size 100M
  3. size 100G

4. Creación o no creación

Este concepto puede parecer un poco extraño, pero tiene su significado. El sistema está pensado por defecto para crear un nuevo fichero de log cada vez que se realiza la rotación, con la creación de un nuevo fichero de log. Esto puede ser especificado de dos formas: La primera es agregando el parámetro create mientras que la segunda es simplemente no agregando nada, ya que el servicio está diseñado para tener ese comportamiento por defecto. Aún así, a veces uno quiere simplemente sobrescribir el contenido del fichero de log actual y actuar como si se registrasen los logs desde 0... No es una práctica muy habitual, pero en ocasiones puede llegar a ser útil. Para lograr dicho propósito habría que recurrir al parámetro nocreate, y en este caso sí que es 100% necesario especificarlo. Eso significa que si queremos que se almacenen nuestros antiguos logs necesitamos recurrir a create, mientras que si no queremos que sea así habría que usar nocreate.

  1. create
  2. nocreate

5.Compresión de logs

Generalmente estos logs no serán consultados a menos que nos veamos en la necesidad explicita de ello; es por eso que por cuestiones de ahorro de espacio en el disco duro se tiene la opción de que los ficheros más antiguos sean comprimidos en formato gzip para ahorrar espacio... Esta opción suele ser muy usada dado su ahorro de espacio en el disco duro y además logrotate está diseñado para mantener descomprimido el último log almacenado (es decir que estarían descomprimidos el log actual y el último almacenado por la rotación), facilitando así la consulta de los datos de éste. El uso de esta funcionalidad es tan sencillo como recurrir al parámetro compress, sin la necesidad de parámetros adicionales ni ningún tipo de especificación; lo cual lo convierte en un recurso muy práctico de usar.

  1. compress

6.Comprobación de logs faltantes

Esto se trata de una comprobación de logs faltantes o erroneos... Durante la rotación de logs se comprueban los logs faltantes y/o erróneos y en caso de que hubiese un problema, el sistema estaría pensado por defecto para no continuar con la rotación de éste fichero... Esto es debido a que el servicio tiene implícitamente "incrustado" el parámetro nomissingok que se encarga de comprobar si hay alguna falla. Esto suele ser muy útil para comprobar que todo está correctamente, pero en ocasiones uno quiere que simplemente se rote, sin que nos importe si falta o falla algo, es por ello que afortunadamente existe un parámetro que nos permite "esquivar" esta traba llamado missingok y que suele ser usado en ficheros vitales, tales como syslog, entre otros. Es decir que si queremos que todo esté revisado a la perfección habría que usar el parámetro nomissingok o no agregarlo directamente mientras que para esquivar dicha comprobación habría que hacer uso de missingok.

  1. nomissingok
  2. missingok

7.Prevencíon de rotaciones innecesarias

Imaginemos que un fichero de log en concreto no ha recibido ningún evento y/o notificación durante el intervalo de rotación que hemos impuesto... Esto crearía un fichero vacío que no tendría nada que aportar y que además podría dar una sensación de seguridad engañosa a aquel que note la presencia de logs antiguos. Afortunadamente este pequeño problema se puede evitar con facilidad, ya que le podemos decir a nuestro fichero que en caso de que un log se encuentre vacío, este no entré en el proceso de rotación... Esto se realiza mediante el uso del parámetro notifempty. Un parámetro sencillo y muy útil que nos puede evitar búsquedas infructuosas entre nuestros ficheros de log antiguos... Es por ello que este parámetro es especialmente usado para los logs más relevantes.

  1. notifempty

8. Acciones post rotación

Aunque no es un parámetro obligatorio, sí que puede ser interesante usarlo dependiendo del tipo de log que queramos rotar... Simplemente establece una serie de acciones y/o comandos que logrotate debe hacer tras realizar la rotación... Dicha acción sería declarada primero especificando que se trata de una acción post-rotación, la cual se declara mediante el parámetro postrotate y al finalizar dicha acción o acciones habría que declarar la finalización de éstas añadiendo la palabra endscript. Esto significa que toda acción que se quiera realizar tras hacer una rotación tendrá la siguiente estructura:

  1. postrotate
  2.         ...
  3. endscript

9.Include

Dentro del fichero de configuración notareis que hay una línea que comienza con include; aquí se incluye la ruta de la carpeta que almacenará los ficheros de configuración específicos para algunos logs en concreto... Esta línea es recomendable dejarla intacta y a continuación explicaré más detalladamente el contenido de esta carpeta.


Ficheros de configuración específicos

Estos ficheros almacenan la configuración de ciertos logs en concreto que queremos que funcionen de forma distinta a lo especificado en el fichero de configuración principal... Todo aquello que se especifique en estos prevalecería sobre lo escrito en el fichero principal, cosa útil si queremos que por ejemplo el log syslog tenga un comportamiento distinto al "habitual". Todos estos ficheros de configuración son almacenados en /etc/logrotate.d/ y aunque todas estas configuraciones personalizadas pueden ir dentro de un mismo fichero; lo ideal a nivel de gestión suele ser almacenar la configuración de un solo log en concreto dentro de un fichero, y en caso de que se almacenen varios, lo ideal es que todos pertenezcan a la misma temática. Esta configuración específica sigue las mismas normas que las seguidas en logrotate.conf, con la diferencia que en este caso, para concretar que se está actuando en un fichero en concreto se escribe la ruta completa del fichero y luego entre llaves se especifica la configuración específica de éste. Es decir que si por ejemplo deseásemos especificar unas reglas en concreto para el log syslog, habría que escribir:

  1. /var/log/syslog
  2. {
  3.         ...
  4. }

En el caso de este log en concreto, veremos que efectivamente está configurado para tener un comportamiento distinto, aunque siempre manteniendo las directrices descritas para el fichero de configuración principal:

  1. /var/log/syslog
  2. {
  3.         rotate 7
  4.         daily
  5.         missingok
  6.         notifempty
  7.         delaycompress
  8.         compress
  9.         postrotate
  10.                 invoke-rc.d rsyslog rotate > /dev/null
  11.         endscript
  12. }

Como podéis comprobar, aunque los logs ya poseen una rotación por defecto, la modificación de ésta es muy sencilla y puede resultarnos especialmente útil si queremos tener todo más registrado o queremos controlar lo máximo posible nuestros entornos más sensibles.

Espero que os resulte útil.

Saludos.

No hay comentarios :

Publicar un comentario