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 configuration
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:
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:
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
Pulsamos en el «Virtual Server» que nos interese
Pulsamos en «Log Files»
Indicamos 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
Listo, 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