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.