Servidores virtuales y el log de Apache

Siempre que nos aparecen problemas en la web , tenemos dos opciones o recurrimos a un experto para que nos lo solucione, o revisamos el log del servidor Apache…. Pero tened en cuenta, que nuestro experto también deberá acudir al log de Apache. Y el problema nace en que ese log por defecto no indica que dominio esta teniendo problemas….

Nuestra propuesta de hoy es una sencilla modificación que nos permitirá saber de cual de nuestros webs provienen los mensajes, añadiendo a la linea del fichero log la URL completa que lo causo.

Para ello deberemos acudir al fichero de configuración del Apache y eso lo podemos hacer de distintas maneras

  • En Centos, Red Hat, y semejantes….
    /etc/httpd/conf/httpd.conf
  • En Debian, Ubuntu, y derivados….
    /etc/apache2/apache2.conf
  • Si teneis instalado Virtualmin/Webmin
    En Webmin->Servers->Apache Webserver->Global configurationwebmin_configuracion_apache

Una vez hayáis encontrado el fichero, tenéis que modificar la configuración con la que se guarda el log, para ello, debéis buscar una lineas semejantes a estas:

LogFormats_apache

 

En estas lineas se definen los posibles formatos que queremos para el/los ficheros de log, y se les asigna un nombre simbólico, que es el que aparece mas a la derecha.

Debian, por ejemplo, incluye otra linea que nos puede ser util:

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined

Que precisamente presenta esa característica de incorporar la URL completa a la linea de error. Os comento el significado de cada trozo:

  • %v – Nombre del host
  • %p – Puerto de llamada
  • %h – dirección ip que solicito la pagina
  • %l – logname remoto. Si no existe, llegara un “-“
  • %u – usuario remoto; si no existe, llegara un “-“
  • %t – Dia y hora en que se termina de procesar la petición
  • %r – El método utilizado para hacer la petición (GET, POST, ….) y la url completa que llego, menos el nombre del host. Se presentará entre comillas para permitir su fácil identificación, ya que puede contener blancos y cualquier carácter….
  • %>s – código de estado de la respuesta (200, 404, 500,…)
  • %O – Número de bytes enviados (debe estar activo mod-logio)
  • %{Referer}i – Ruta completa de la pagina desde la que se realizó la llamada
  • %{User-Agent}i – Identificador den navegador que realiza la llamada

Si utilizáramos el formato que viene definido como “common”:

LogFormat "%h %l %u %t \"%r\" %>s %b" common

obtendríamos lineas en el log de tipo:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

El formato combined ( el mas habitual)

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined

nos proporciona

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"

y el que os proponemos vhost_combined

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined

genera esto:

2014-11-06_09h39_35

 

Hasta aquí, hemos definido un nuevo formato para el log, ahora deberemos indicar donde queremos usarlo, y eso lo hacemos con la directiva

CustomLog logs/access_log  vhost_combined

que podemos indicar como valor por defecto para que lo utilice cualquier virtual, o en los host virtuales para que solo uno concreto lo utilice. Si un host virtual declara  un CustomLog, cancela la funcionalidad de default y solo se crean los log definidos dentro de él

también debemos tener en cuenta que podemos tener tantos logs como queramos, solo los debemos definir en sucesivas lineas CustomLog, En cada linea indicamos:

  • Palabra reservada “CustomLog”
  • ruta al fichero log, y nombre. Si se indica relativa, se situara en “/var/”….lo que indiquemos
  • Nombre simbólico del formato de log deseado, según se crearon en “LogFormat”

Todo esto lo podéis hacer en el fichero de configuración de host virtuales (en Debian y Ubuntu se puede crear un fichero separado para cada host virtual en /etc/apache2/site-availables, y en Centos, están todos dentro del mismo fichero de configuración que habéis modificado.

Si estáis trabajando con Webmin, es mas sencillo, en Webmin->Servers->Apache Webserver”, tenemos la lista de los host virtuales creados

2014-11-06_10h04_00

 

Pulsamos en el “Virtual Server” que nos interese2014-11-06_10h08_24

Pulsamos en “Log Files”

2014-11-06_10h09_50Indicamos el nombre simbólico del formato que hemos creado, y la ruta y nombre del fichero a generar; en este caso, ya que voy a tener dentro el nombre del host, opto porque todos los host compartan el mismo archivo.

Podemos guardar la modificación con “Save”, y aplicar los cambios al servidor web con

2014-11-06_10h13_11Listo, a partir de este momento en /var/log/access_combined_log tendréis el log de vuestro servidor apache con la indicación del virtual host que le corresponde.

 

Si necesitáis mas opciones de los formatos podéis leerlas en la documentación oficial de apache

 

 

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Formacion, Linux y etiquetada . Guarda el enlace permanente.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.