¿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 String | Descripción |
---|---|
%h | Es el host que accede al servidor. |
%l | Es el protocolo de identificación del usuario RFC 1413. |
%u | Es 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). |
%t | Es la fecha incluyendo hora y UTC. |
%r | Es la solicitud realizada por el usuario. |
%>s | Es el código de respuesta de estado del protocolo HTTP. |
%{Referer}i | Es la URI de referencia al recurso. |
%{User-agent}i | Es 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 String | Descripción |
---|---|
%% | Es el signo de porcentaje. |
%a | Es la dirección IP remota. |
%A | Es la dirección IP local. |
%B | Es el Tamaño del "response" (respuesta) en bytes incluyendo la cabecera HTTP. |
%b | Es el Tamaño del "response" (respuesta) en bytes incluyendo la cabecera HTTP, en formato CLF. |
%{VARNAME}C | Es el contenido de la cookie en el request (petición) enviada al servidor. |
%D | Es el tiempo tomado por el servidor en dar una respuesta. |
%{VARNAME}e | Nos da el contenido de la variable. |
%f | Es el nombre del archivo. |
%h | Es el Host Remoto. |
%H | Es el protocolo. |
%k | Es el numero de "keepalive" manejadas en la conexion. |
%m | Es el método de petición. |
%p | Es el puerto canónico del servidor de servicio de la petición. |
%q | Es el query string. |
%u | Es el nombre del usuario. |
%U | Es 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
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter