Optimizaciones: Configurar logs en pipes en lugar de ficheros

En Apache, podemos reducir la CPU consumida por el servidor (aumentando el rendimiento) y podemos evitar un reinicio cada vez que se rotan los logs (logrotate, que viene configurado en muchas distribuciones lo provoca) si en lugar de utilizar un fichero para escribir los informes de accesos y errores utilizamos una pipe a otro proceso.

Podemos utilizar cualquier programa para realizar esta operación, pero aquí hablaré de dos (rotatelogs, del propio Apache) y cronolog.

Empezando el log vía pipe

Lo único que debemos hacer es incluir en la configuración de nuestro Virtualhost (/etc/apache2/sites-available/mi_virtualhost), en la parte de logging (las lineas que empiezan por ErrorLog y CustomLog), lo siguiente:

ErrorLog «|/usr/sbin/rotatelogs /home/cloud/www/totaki.com/logs/error.%Y-%m-%d-%H_%M_%S.log 86400»
CustomLog «|/usr/sbin/rotatelogs /home/cloud/www/totaki.com/logs/access.%Y-%m-%d-%H_%M_%S.log 86400» combined

en el caso de rotatelogs, en este caso «%Y-%m-%d-%H_%M_%S» es una cadena de formato de fecha. Podemos encontrar todas las palabras clave si miramos el manual.
El número 86400 hace referencia al número de segundos que se mantendrá cada log, en este caso, 1 día, aunque aquí podemos especificar por ejemplo «2M» para que se rote el log cuando lleguemos a 2Megabytes.
La ruta de rotetelogs puede variar dependiendo de tu sistema, ante la duda, podemos ejecutar como root:

#which rotatelogs

En el caso de cronolog, programa que debemos instalar aparte:

ErrorLog «|/usr/bin/cronolog /home/cloud/www/totaki.com/logs/%Y/%m/%d/error.log»
CustomLog «|/usr/bin/cronolog /home/cloud/www/totaki.com/logs/%Y/%m/%d/access» combined

cronolog, detecta la unidad de tiempo más pequeña representada en el nombre del fichero, y rotará en función de esa unidad, en el ejemplo, rotará diariamente, y si no especificamos %d, rotaremos cada mes.
Este programa tiene alguna que otra característica interesante como crear enlaces al fichero actual donde se está escribiendo el log.

Eliminar la anterior rotación de Apache

Si estábamos utilizando logrotate, conviene hacer que no rote más los logs de Apache (y evitamos que se reinicie el servicio), pero es interesante mantener este programa activo ya que otros en otros servicios sí que será necesario.
En mi caso, el archivo de configuración principal es /etc/logrotate.conf y los archivos de configuración específicos de cada programa están en /etc/logrotate.d/, siendo el de Apache /etc/logrotate.d/apache2.
Podemos borrar ese fichero (/etc/logrotate.d/apache2), pero, como a mi no me gusta destruir nada, prefiero hacer lo siguiente (como root):

# mkdir /etc/logrotate.d_old/
# mv /etc/logrotate.d/apache2 /etc/logrotate.d_old

Así conservaremos el fichero antiguo en nuestro servidor.

Evitando iniciar demasiadas shells

Por defecto, Apache inicia una shell (/bin/bash) cuando se llama a un programa para escribir logs (como hemos hecho aquí). A veces sí que es necesario, pero otras veces no, como es el caso de logrotate o cronolog (aunque sí lo sería para un bash script. Así que en este caso, podremos utilizar dos signos de pipe (||) en lugar de uno (|), quedando la configuración de la siguiente manera:

ErrorLog «||/usr/sbin/rotatelogs /home/cloud/www/totaki.com/logs/error.%Y-%m-%d-%H_%M_%S.log 86400″
CustomLog «||/usr/sbin/rotatelogs /home/cloud/www/totaki.com/logs/access.%Y-%m-%d-%H_%M_%S.log 86400″ combined

o

ErrorLog «||/usr/bin/cronolog /home/cloud/www/totaki.com/logs/%Y/%m/%d/error.log»
CustomLog «||/usr/bin/cronolog /home/cloud/www/totaki.com/logs/%Y/%m/%d/access» combined

Deja un comentario

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