Como crear logs personalizados en Apache

- Andrés Cruz

In english

Como crear logs personalizados en Apache

¿Qué son los logs?

Los logs de las aplicaciones son registros generados por las aplicaciones en base a una serie de eventos registrados en un tiempo particular; son empleados para registrar datos como:

  • Errores de la aplicación.
  • Usuarios que acceden a la aplicación.
  • Tiempo en determinado módulo de la aplicación.

Entre otros parámetros; los logs son herramientas importantes para detectar posibles problemas, errores, bug en la aplicación.

Los logs en Apache

Los logs de Apache pueden configurarse fácilmente utilizando la directiva CustomLog dentro del VirtualHost utilizando la siguiente sintaxis:

CustomLog <ruta>/<archivo>.<extensión> formato

En donde:

  • <ruta>: Es la localización del <archivo>; es decir, en donde está referenciado el <archivo>.
  • <archivo>: Es el nombre que le coloque al log.
  • <extension>: (Opcional) Es la extensión del archivo.
  • <formato>: Es la configuración del log los cuales pueden ser:
    • combined: %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"
    • common: %h %l %u %t \"%r\" %>s %b

En donde cada uno de los "format string" significa:

Format StringDescripción
%hEs el host que accede al servidor.
%lEs el protocolo de identificación del usuario RFC 1413.
%uEs el nombre del usuario (comúnmente la salida será un guión a no ser que se trate de un usuario autenticado en el sistema).
%tEs la fecha incluyendo hora y UTC.
%rEs la solicitud realizada por el usuario.
%>sEs el código de respuesta de estado del protocolo HTTP.
%{Referer}iEs la URI de referencia al recurso.
%{User-agent}iEs el user-agent del usuario.

La tabla de parámetros basada en la documentación oficial de Apache; mencionando algunos de los "Format String" más utilizados:

Format StringDescripción
%%Es el signo de porcentaje.
%aEs la dirección IP remota.
%AEs la dirección IP local.
%BEs el Tamaño del "response" (respuesta) en bytes incluyendo la cabecera HTTP.
%bEs el Tamaño del "response" (respuesta) en bytes incluyendo la cabecera HTTP, en formato CLF.
%{VARNAME}CEs el contenido de la cookie en el request (petición) enviada al servidor.
%DEs el tiempo tomado por el servidor en dar una respuesta.
%{VARNAME}eNos da el contenido de la variable.
%fEs el nombre del archivo.
%hEs el Host Remoto.
%HEs el protocolo.
%kEs el numero de "keepalive" manejadas en la conexion.
%mEs el método de petición.
%pEs el puerto canónico del servidor de servicio de la petición.
%qEs el query string.
%uEs el nombre del usuario.
%UEs la URL de petición, no incluye ningún query string.

Además podemos crear un formato de log personalizado utilizando la directiva "LogFormat"; como veremos en la siguiente sección.

Múltiples logs de acceso en Apache

Apache permite manejar múltiples logs de accesos; para crear un log desde Apache basta con especificar tantas directivas CustomLog como logs se deseen.

Creando un log con la directiva CustomLog en Apache

Por ejemplo, las siguientes directivas crean tres logs de accesos.

  • El primero contiene información básica CLF.
  • El segundo contiene información sobre los recursos accedidos y el usuario.
  • el último "CustomLog" Muestra el agente utilizado.
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -> %U"
CustomLog logs/agent_log "%{User-agent}i"

Los logs de Condiciones en Apache

Puede resultar conveniente excluir información de los logs; esto lo podemos hacer fácilmente utilizando variables de entorno (environment variables). primero debemos setear la variable de entorno para indicar que la solicitud cumple con ciertas condiciones; Esto se logra generalmente con <SetEnvIf. Entonces la cláusula env= de la directiva CustomLog; se usa para incluir o excluir las solicitudes que se establece la variable de entorno.

Ejemplo de logs de Condiciones en Apache

SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
SetEnvIf Request_URI "^/robots\.txt$" dontlog
CustomLog logs/access_log common env=!dontlog

Otro ejemplo consiste en mandar a un log diferente las peticiones de los que "hablan inglés" a un archivo diferente.

SetEnvIf Accept-Language "en" english CustomLog logs/english_log common env=english
CustomLog logs/non_english_log common env=!english

Puedes aprender más visitando la documentación oficial de Apache en la siguiente página Artículo original: http://httpd.apache.org/docs/1.3/logs.html

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.