Búsqueda de sitios web

Cómo configurar formatos personalizados de acceso y registro de errores en Nginx


El servidor Nginx HTTP tiene una función de registro fenomenal que es altamente personalizable. En este artículo, explicaremos cómo configurar sus propios formatos para registros de acceso y errores para Nginx en Linux.

El objetivo de esta guía es ayudarle a comprender cómo se generan los registros, a fin de configurar formatos de registro personalizados con fines de depuración, solución de problemas o análisis de lo que ocurre dentro de su servidor web, así como de las aplicaciones web (como las solicitudes de seguimiento).

Lea también: 4 buenas herramientas de administración y monitoreo de registros de código abierto para Linux

Este artículo consta de tres secciones que le explicarán cómo configurar los registros de acceso/error y cómo habilitar el registro condicional en Nginx.

Configurar registros de acceso en Nginx

En Nginx, todas las solicitudes de los clientes al servidor se registran en el registro de acceso en un formato específico utilizando el módulo ngx_http_log_module.

El archivo de registro predeterminado es log/access.log (generalmente /var/log/nginx/access_log en sistemas Linux) y el formato predeterminado para el registro normalmente es el combinado o principal. formato (esto puede variar de una distro a otra).

La directiva access_log (aplicable en http, servidor, ubicación, si está en ubicación y límite excepto contexto) se utiliza para configurar el archivo de registro y la directiva log_format (aplicable bajo la Sólo contexto http) se utiliza para configurar el formato de registro. El formato de registro se describe mediante variables comunes y variables que se generan solo en el momento en que se escribe un registro.

La sintaxis para configurar un formato de registro es:

log_format format_name 'set_of_variables_to_define_format';

y la sintaxis para configurar el registro de acceso es:

access_log /path/to/log_file format_name;		#simplest form 
OR
access_log /path/to/log_file [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

El siguiente es un extracto del archivo de configuración predeterminado de Nginx /etc/nginx/nginx.conf en CentOS 7.

http {
	#main log format 
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                               '$status $body_bytes_sent "$http_referer" '
                               '"$http_user_agent" "$http_x_forwarded_for"';

	access_log /var/log/nginx/access.log;
}

Este formato de registro produce la siguiente entrada de registro.

127.0.0.1 - dbmanager [20/Nov/2017:18:52:17 +0000] "GET / HTTP/1.1" 401 188 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"

El siguiente es otro formato de registro útil que utilizamos para rastrear solicitudes a nuestras aplicaciones web utilizando algunas de las variables predeterminadas; lo más importante es que tiene el ID de la solicitud y registra los detalles de la ubicación del cliente (país, código de país, región y ciudad).

log_format  custom '$remote_addr - $remote_user [$time_local] '
                         	     '"$request" $status $body_bytes_sent '
                      		     '"$http_referer" "$http_user_agent" '
                     		     '"$http_x_forwarded_for" $request_id '
                   		     '$geoip_country_name $geoip_country_code '
                  		     '$geoip_region_name $geoip_city ';

Puedes usarlo así:

access_log  /var/log/nginx/access.log custom;

Esto producirá una entrada de registro que se verá así.

153.78.107.192 - - [21/Nov/2017:08:45:45 +0000] "POST /ngx_pagespeed_beacon?url=https%3A%2F%2Fwww.example.com%2Fads%2Ffresh-oranges-1509260795 HTTP/2.0" 204 0 "https://www.suasell.com/ads/fresh-oranges-1509260795" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0" "-" a02b2dea9cf06344a25611c1d7ad72db Uganda UG Kampala Kampala 

Puede especificar varios registros usando las directivas access_log en el mismo nivel; aquí estamos usando más de un archivo de registro en el contexto http.

http{
	##default log format
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                	      '$status $body_bytes_sent "$http_referer" '
                                         '"$http_user_agent" "$http_x_forwarded_for"';
      
	##request tracing using custom format
	log_format custom '$remote_addr - $remote_user [$time_local] '
                                           '"$request" $status $body_bytes_sent '
                                           '"$http_referer" "$http_user_agent" '
                                           '"$http_x_forwarded_for" $request_id '
                                           '$geoip_country_name $geoip_country_code '
                                          '$geoip_region_name $geoip_city ';

	##this uses the default log format
	access_log /var/log/nginx/access.log;

	##this uses the our custom log format
	access_log /var/log/nginx/custom_log custom;
}

Los siguientes son ejemplos de configuraciones de registro más avanzadas, que son útiles para formatos de registro que contienen variables relacionadas con la compresión y para crear archivos de registro comprimidos:

access_log /var/log/nginx/custom_log custom buffer 32k;
access_log /path/to/log.gz compression  gzip  flush=5m;

Configurar registros de errores en Nginx

En caso de que Nginx experimente algún problema técnico, registra información relativa a él en el registro de errores. Estos problemas se dividen en diferentes niveles de gravedad: depuración, información, aviso, advertencia, error . (este es el nivel predeterminado y funciona globalmente), crit, alerta o emerg.

El archivo de registro predeterminado es log/error.log, pero normalmente se encuentra en /var/log/nginx/ en las distribuciones de Linux. La directiva error_log se usa para especificar el archivo de registro y se puede usar en el contexto principal, http, correo, transmisión, servidor y ubicación (en ese orden).

También debes tener en cuenta que:

  • Las configuraciones en el contexto principal siempre son heredadas por los niveles inferiores en el orden anterior.
  • y las configuraciones en los niveles inferiores anulan las configuraciones heredadas de los niveles superiores.

Puede configurar el registro de errores utilizando la siguiente sintaxis:

error_log /path/to/log_file log_level;

Por ejemplo:

error_log /var/log/nginx/error_log warn; 

Esto le indicará a Nginx que registre todos los mensajes de tipo warn y niveles de registro más severos crit, alert y emerg. mensajes.

En el siguiente ejemplo, se registrarán los mensajes de los niveles crítico, alerta y emergencia.

error_log /var/www/example1.com/log/error_log crit;

Considere la configuración a continuación, aquí hemos definido el registro de errores en diferentes niveles (en el contexto http y del servidor). En caso de error, el mensaje se escribe en un solo registro de errores, el más cercano al nivel donde apareció el error.

http {
	log_format compression '$remote_addr - $remote_user [$time_local] '
                           '"$request" $status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent" "$gzip_ratio"';
	
	error_log  /var/log/nginx/error_log  crit;

    	server {
		listen 80;
		server_name example1.com;

		#this logs errors messages for example1.com only
      		error_log  /var/log/nginx/example1.error_log  warn;
            	…...
	}

     	server {
		listen 80;
		server_name  example2.com;

		#this logs errors messages for example2.com only
        		error_log  /var/log/nginx/example1.error_log;
        		…….
    	}
}

Si utiliza más de una directiva error_log como en la configuración siguiente (mismo nivel), los mensajes se escriben en todos los registros especificados.

server {
		listen 80;
		server_name example1.com;

      		error_log  /var/www/example1.com/log/error_log  warn;
		error_log  /var/log/nginx/example1.error_log  crit;
            	…...
	}

Configurar el registro condicional en Nginx

En algunos casos, es posible que deseemos que Nginx realice un registro condicional de mensajes. Nginx no tiene que registrar todos los mensajes, por lo tanto, podemos ignorar entradas de registro insignificantes o menos importantes de nuestros registros de acceso para casos particulares.

Podemos usar el módulo ngx_http_map_module que crea variables cuyos valores dependen de los valores de otras variables. Los parámetros dentro de un bloque de mapa (que deberían existir solo en el contenido http) especifican una asignación entre los valores fuente y resultante.

Para este tipo de configuración, no se registrará una solicitud si la condición se evalúa como “0 ” o una cadena vacía. Este ejemplo excluye solicitudes con códigos de estado HTTP 2xx y 3xx.

http{
	map $status $condition {
		~^[23] 0;
    		default 1;
	}
	server{
		access_log  /path/to/access.log  custom if=$condition;
	}
}

A continuación se muestra otro ejemplo útil para depurar una aplicación web en una fase de desarrollo. Esto ignorará todos los mensajes y solo registrará la información de depuración.

 
http{
	map $info  $debuggable { 
    		default     0; 
    		debug       1; 
	} 
	server{
		……..
		access_log /var/log/nginx/testapp_debug_access_log  debug if=$debuggable; 
		#logs other requests 
		access_log  /var/log/nginx/testapp_access.log  main; 
		…….
	}
}

Puede encontrar más información, incluido el inicio de sesión en syslog, aquí.

¡Eso es todo por ahora! En esta guía, explicamos cómo configurar un formato de registro personalizado para registros de acceso y errores en Nginx. Utilice el formulario de comentarios a continuación para hacer preguntas o compartir sus opiniones sobre este artículo.