Recherche de site Web

Comment configurer les formats d'accès personnalisés et de journal d'erreurs dans Nginx


Le serveur Nginx HTTP dispose d'une fonction de journalisation phénoménale et hautement personnalisable. Dans cet article, nous expliquerons comment configurer vos propres formats pour les journaux d'accès et d'erreurs pour Nginx sous Linux.

L'objectif de ce guide est de vous aider à comprendre comment les journaux sont générés, afin de configurer des formats de journaux personnalisés à des fins de débogage, de dépannage ou d'analyse de ce qui se passe au sein de votre serveur Web ainsi que des applications Web (telles que les demandes de traçage).

Lire aussi : 4 bons outils de surveillance et de gestion des journaux Open Source pour Linux

Cet article est composé de trois sections qui vous éclaireront sur la configuration des journaux d'accès/d'erreurs et sur la manière d'activer la journalisation conditionnelle dans Nginx.

Configuration des journaux d'accès dans Nginx

Sous Nginx, toutes les requêtes des clients vers le serveur sont enregistrées dans le journal d'accès dans un format spécifié à l'aide du module ngx_http_log_module.

Le fichier journal par défaut est log/access.log (généralement /var/log/nginx/access_log sur les systèmes Linux) et le format par défaut pour la journalisation est normalement le format combiné ou principal. format (cela peut varier d’une distribution à l’autre).

La directive access_log (applicable dans le http, le serveur, l'emplacement, si dans l'emplacement et la limite hors contexte) est utilisée pour définir le fichier journal et la directive log_format (applicable sous le contexte http uniquement) est utilisé pour définir le format du journal. Le format du journal est décrit par des variables communes et des variables générées uniquement au moment de l'écriture d'un journal.

La syntaxe pour configurer un format de journal est la suivante :

log_format format_name 'set_of_variables_to_define_format';

et la syntaxe de configuration du journal d'accès est :

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]];

Ce qui suit est un extrait du fichier de configuration Nginx par défaut /etc/nginx/nginx.conf sur 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;
}

Ce format de journal génère l'entrée de journal suivante.

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"

Ce qui suit est un autre format de journalisation utile que nous utilisons pour suivre les demandes vers nos applications Web en utilisant certaines des variables par défaut. Il contient principalement l'ID de la demande et enregistre les détails de l'emplacement du client (pays, code du pays, région et ville).

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 ';

Vous pouvez l'utiliser comme ceci :

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

Cela produira une entrée de journal qui apparaît comme ceci.

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 

Vous pouvez spécifier plusieurs journaux à l'aide des directives access_log au même niveau, nous utilisons ici plusieurs fichiers journaux dans le contexte 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;
}

Voici des exemples de configurations de journalisation plus avancées, utiles pour les formats de journaux contenant des variables liées à la compression et pour la création de fichiers journaux compressés :

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

Configuration des journaux d'erreurs dans Nginx

Si Nginx rencontre des problèmes, il enregistre les informations les concernant dans le journal des erreurs. Ces problèmes relèvent de différents niveaux de gravité : debug, info, avis, avertissement, erreur. (il s'agit du niveau par défaut et fonctionne globalement), crit, alert ou emerg.

Le fichier journal par défaut est log/error.log, mais il se trouve normalement dans /var/log/nginx/ sur les distributions Linux. La directive error_log est utilisée pour spécifier le fichier journal et peut être utilisée dans le contexte principal, http, courrier, flux, serveur, emplacement (dans cet ordre).

Il convient également de noter que :

  • Les configurations dans le contexte principal sont toujours héritées par les niveaux inférieurs dans l'ordre ci-dessus.
  • et les configurations des niveaux inférieurs remplacent les configurations héritées des niveaux supérieurs.

Vous pouvez configurer la journalisation des erreurs à l'aide de la syntaxe suivante :

error_log /path/to/log_file log_level;

Par exemple:

error_log /var/log/nginx/error_log warn; 

Cela demandera à Nginx d'enregistrer tous les messages de type warn et de niveau de journalisation plus grave crit, alert et emerg. messages.

Dans l'exemple suivant, les messages de niveaux crit, alert et emerg seront enregistrés.

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

Considérez la configuration ci-dessous, ici, nous avons défini la journalisation des erreurs à différents niveaux (dans le contexte http et serveur). En cas d'erreur, le message est écrit dans un seul journal d'erreurs, celui le plus proche du niveau où l'erreur est apparue.

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 vous utilisez plusieurs directives error_log comme dans la configuration ci-dessous (même niveau), les messages sont écrits dans tous les journaux spécifiés.

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;
            	…...
	}

Configuration de la journalisation conditionnelle dans Nginx

Dans certains cas, nous pouvons souhaiter que Nginx effectue une journalisation conditionnelle des messages. Tous les messages ne doivent pas nécessairement être enregistrés par Nginx, nous pouvons donc ignorer les entrées de journal insignifiantes ou moins importantes de nos journaux d'accès pour des instances particulières.

Nous pouvons utiliser le module ngx_http_map_module qui crée des variables dont les valeurs dépendent des valeurs d'autres variables. Les paramètres à l'intérieur d'un bloc de carte (qui ne doivent exister que dans le contenu http) spécifient un mappage entre la source et les valeurs résultantes.

Pour ce type de paramètre, une requête ne sera pas enregistrée si la condition est évaluée à « 0 » ou à une chaîne vide. Cet exemple exclut les requêtes avec les codes d'état HTTP 2xx et 3xx.

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

Voici un autre exemple utile pour déboguer une application Web en phase de développement. Cela ignorera tous les messages et enregistrera uniquement les informations de débogage.

 
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; 
		…….
	}
}

Vous pouvez trouver plus d'informations, y compris la connexion à Syslog, ici.

C'est tout pour le moment! Dans ce guide, nous avons expliqué comment configurer un format de journalisation personnalisé pour les journaux d'accès et d'erreurs dans Nginx. Utilisez le formulaire de commentaires ci-dessous pour poser des questions ou partager vos réflexions sur cet article.