Uno de los directorios más interesantes (y quizás también uno de los más importantes) en un sistema Linux es /var/log
. Según el Filesystem Hierarchy Standard, la actividad de la mayoría de los servicios que se ejecutan en el sistema se escriben en un archivo dentro de este directorio o en uno de sus subdirectorios.
Estos archivos se conocen como logs y son la clave para examinar cómo está funcionando el sistema (y cómo se ha comportado en el pasado). Los logs son también la primera fuente de información en la que miran los administradores e ingenieros mientras solucionan problemas.
Si miramos el contenido de /var/log
en un CentOS/RHEL/Fedora y Debian/Ubuntu (para variar) veremos los siguientes archivos de log y subdirectorios.
Tenga en cuenta que el resultado puede ser algo diferente en su caso dependiendo de los servicios que se estén ejecutando en su(s) sistema(s) y el tiempo que lleven funcionando.
En RHEL/CentOS y Fedora
# ls /var/log
En Debian y Ubuntu
# ls /var/log
En ambos casos, podemos observar que algunos de los nombres de los registros terminan como es de esperar en «log», mientras que otros son renombrados usando una fecha (por ejemplo, maillog-20160822 en CentOS) o comprimidos (considere auth.log.2.gz y mysql.log.1.gz en Debian).
Este no es un comportamiento predeterminado en función de la distribución elegida, sino que puede cambiarse a voluntad mediante directivas en los archivos de configuración, como veremos en este artículo.
Si los logs se guardaran para siempre, acabarían llenando el sistema de archivos donde reside /var/log. Para evitarlo, el administrador del sistema puede utilizar una bonita utilidad llamada logrotate para limpiar los logs de forma periódica.
En pocas palabras, logrotate renombrará o comprimirá el log principal cuando se cumpla una condición (de la que hablaremos en un minuto) para que el siguiente evento se registre en un archivo vacío.
Además, eliminará los archivos de log «antiguos» y mantendrá los más recientes. Por supuesto, nosotros decidimos qué significa «viejo» y con qué frecuencia queremos que logrotate limpie los registros por nosotros.
Instalación de Logrotate en Linux
Para instalar logrotate, sólo tienes que utilizar tu gestor de paquetes:
---------- On Debian and Ubuntu ---------- # aptitude update && aptitude install logrotate ---------- On CentOS, RHEL and Fedora ---------- # yum update && yum install logrotate
Vale la pena y es bueno tener en cuenta que el archivo de configuración (/etc/logrotate.conf
) puede indicar que se pueden colocar otras configuraciones más específicas en archivos individuales .conf
dentro de /etc/logrotate.d.
Este será el caso si y sólo si la siguiente línea existe y no está comentada:
include /etc/logrotate.d
Nos quedaremos con este enfoque, ya que nos ayudará a mantener las cosas en orden, y usaremos la caja Debian para los siguientes ejemplos.
Configurar Logrotate en Linux
Siendo una herramienta muy versátil, logrotate proporciona un montón de directivas para ayudarnos a configurar cuándo y cómo se van a rotar los logs, y qué debe pasar justo después.
Insertemos el siguiente contenido en /etc/logrotate.d/apache2.conf (ten en cuenta que lo más probable es que tengas que crear ese archivo) y examinemos cada línea para indicar su propósito:
/var/log/apache2/* { weekly rotate 3 size 10M compress delaycompress}
La primera línea indica que las directivas dentro del bloque se aplican a todos los registros dentro de /var/log/apache2:
- semanalmente significa que la herramienta intentará rotar los registros semanalmente. Otros valores posibles son diario y mensual.
- Rotar 3 indica que sólo se deben mantener 3 registros rotados. Por lo tanto, el archivo más antiguo se eliminará en la cuarta ejecución posterior.
- size=10M establece el tamaño mínimo para que la rotación tenga lugar en 10M. En otras palabras, cada registro no se rotará hasta que alcance los 10MB.
- Compress y delaycompress se utilizan para indicar que todos los registros rotados, a excepción del más reciente, deben ser comprimidos.
Ejecutamos un dry-run para ver qué haría logrotate si se ejecutara realmente ahora. Utiliza la opción -d
seguida del archivo de configuración (puedes ejecutar realmente logrotate omitiendo esta opción):
# logrotate -d /etc/logrotate.d/apache2.conf
Los resultados se muestran a continuación:
En lugar de comprimir los logs, podríamos renombrarlos con la fecha en que fueron rotados. Para ello, utilizaremos la directiva dateext
. Si nuestro formato de fecha es distinto al predeterminado yyyymmdd, podemos especificarlo usando dateformat.
Notamos que incluso podemos evitar que se produzca la rotación si el registro está vacío con notifempty. Además, vamos a decirle a logrotate que envíe por correo el registro rotado al administrador del sistema ([email protected] en este caso) para su / su referencia (esto requerirá un servidor de correo para ser configurado, que está fuera del alcance de este artículo).
Si desea obtener correos electrónicos sobre logrotate, puede configurar el servidor de correo Postfix como se muestra aquí: Instalar servidor de correo Postfix
Esta vez utilizaremos /etc/logrotate.d/squid.conf para rotar únicamente /var/log/squid/access.log:
/var/log/squid/access.log { monthly create 0644 root root rotate 5 size=1M dateext dateformat -%d%m%Y notifempty mail [email protected]}
Como podemos ver en la imagen inferior, este log no necesitaba ser rotado. Sin embargo, cuando se cumpla la condición de tamaño (size=1M), el log rotado pasará a llamarse access.log-25082020 (si el log fue rotado el 25 de agosto de 2020) y el log principal (access.log) se volverá a crear con los permisos de acceso establecidos en 0644 y con root como propietario y dueño del grupo.
Finalmente, cuando el número de logs llegue finalmente a 6, el log más antiguo se enviará a [email protected].
Ahora supongamos que queremos ejecutar un comando personalizado cuando se produzca la rotación. Para ello, coloca la línea con dicho comando entre las directivas postrotate y endscript.
Por ejemplo, supongamos que queremos enviar un correo electrónico a root cuando alguno de los logs dentro de /var/log/myservice se rote. Añadamos las líneas en rojo a /etc/logrotate.d/squid.conf:
/var/log/myservice/* {monthlycreate 0644 root rootrotate 5size=1M postrotate echo "A rotation just took place." | mail root endscript}
Por último, pero no por ello menos importante, es importante tener en cuenta que las opciones presentes en /etc/logrotate.d/*.conf
anulan las del archivo de configuración principal en caso de conflicto.
Logrotate y Cron
Por defecto, la instalación de logrotate crea un archivo crontab dentro de /etc/cron.daily llamado logrotate. Al igual que ocurre con el resto de archivos crontab dentro de este directorio, se ejecutará diariamente a partir de las 6:25 am si anacron no está instalado.
De lo contrario, la ejecución comenzará alrededor de las 7:35 am. Para verificarlo, observe la línea que contiene cron.daily tanto en /etc/crontab como en /etc/anacrontab.
Resumen
En un sistema que genera varios logs, la administración de dichos archivos puede simplificarse enormemente utilizando logrotate. Como hemos explicado en este artículo, rotará, comprimirá, eliminará y enviará por correo automáticamente los registros de forma periódica o cuando el archivo alcance un tamaño determinado.
Sólo tienes que asegurarte de que está configurado para ejecutarse como una tarea cron y logrotate te facilitará mucho las cosas. Para más detalles, consulte la página man.