Comment configurer les formats de journal d'accès et d'erreur personnalisés dans nginx

Comment configurer les formats de journal d'accès et d'erreur personnalisés dans nginx

Nginx http Le serveur a une installation de journalisation phénoménale qui est hautement personnalisable. Dans cet article, nous expliquerons comment configurer vos propres formats pour les journaux d'accès et d'erreur pour Nginx dans Linux.

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

Lire aussi: 4 Bonnes outils de surveillance du journal open source et de gestion pour Linux

Cet article est composé de trois sections qui vous éclaireront sur la configuration Journaux d'accès / d'erreur et comment activer la journalisation conditionnelle dans nginx.

Configuration des journaux d'accès dans nginx

Sous Nginx, Toutes les demandes du client au serveur sont recueillies dans le journal d'accès dans un format spécifié en utilisant le ngx_http_log_module module.

Le fichier journal par défaut est journal / accès.enregistrer (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 (cela peut varier d'une distribution à une autre).

Le Access_log La directive (applicable dans le HTTP, le serveur, l'emplacement, si dans l'emplacement et la limite sauf le contexte) est utilisé pour définir le fichier journal et le log_format La directive (applicable dans le contexte HTTP uniquement) est utilisée pour définir le format de journal. Le format de journal est décrit par des variables communes et des variables qui ne généraient qu'au moment où un journal est écrit.

La syntaxe pour configurer un format de journal est:

log_format format_name 'set_of_variables_to_define_format'; 

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

access_log / path / to / log_file format_name; #simplev Form ou Access_log / path / to / log_file [format [tampon = taille] [gzip [= niveau]] [flush = temps] [if = condition]]; 

Ce qui suit est un extrait du fichier de configuration Nginx par défaut / etc / nginx / nginx.confli sur Centos 7.

/ etc / nginx / nginx.confli
http #main format log_format main '$ Remote_addr - $ Remote_User [$ time_local] "$ request" "$ status $ body_bytes_sent" $ http_referrer "" "$ http_user_ager" "$ http_x_forwarded_for"' '; Access_log / var / log / nginx / access.enregistrer;  

Ce format de journal donne la saisie du journal suivant.

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 tracer les demandes à nos applications Web en utilisant certaines des variables par défaut, il a surtout les détails de l'emplacement des clients de l'ID de demande et des journaux (Country, Code, région et ville).

/ etc / nginx / nginx.confli
Log_format personnalisé '$ 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_Count_counw 

Vous pouvez l'utiliser comme ceci:

Access_log / var / log / nginx / access.Journal 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.exemple.com% 2fads% 2ffresh-oranges-1509260795 http / 2.0 "204 0" https: // www.suasell.com / publicités / frais-oranges-1509260795 "" Mozilla / 5.0 (x11; Ubuntu; Linux x86_64; RV: 47.0) Gecko / 20100101 Firefox / 47.0 "" - "A02B2DEA9CF06344A25611C1D7AD72DB OUGANDA UG KAMPALA KAMPALA 

Vous pouvez spécifier plusieurs journaux à l'aide du Access_log Directives au même niveau, nous utilisons ici plus d'un fichier journal dans le contexte HTTP.

/ etc / nginx / nginx.confli
http ## Format de journal par défaut LOG_FORMAT MAIN '$ Remote_addr - $ Remote_User [$ time_local] "$ request" "$ status $ body_bytes_sent" $ http_referrer "" "$ http_user_ager" "$ http_x_forwarded_for"'; ## Traçage de la demande à l'aide du format personnalisé log_format personnalisé '$ Remote_addr - $ Remote_User [$ time_local] "" $ request "$ status $ body_bytes_sent" "$ http_referrer" "$ http_user_agent" "" "http_x_forwarded_for" $ request_id "$ geoip_country_name $ Geoip_code_id" $ Geoip_Country_Name $ Geoip_COND_ID "$ GEOIP_COUNTY_NAME $ GEOIP_CUNTY_ID" $ GEOIP_COUNTY_NAME $ GEOIP_CUNTY_ID "$ GEOIP_COUNTY_NAMA $ GEOIP_REGION_NAME $ GEOIP_CITY '; ## Ceci utilise le format de journal par défaut Access_log / var / log / nginx / Access.enregistrer; ## Ceci utilise notre format de journal personnalisé Access_log / var / log / nginx / custom_log personnalisé;  

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

Access_log / var / log / nginx / custom_log Custom Buffer 32k; Access_log / path / to / log.compression GZ Gzip Flush = 5m; 

Configuration des journaux d'erreur dans nginx

Au cas où Nginx éprouve des problèmes, il enregistre des informations en les concernant dans le journal d'erreur. Ces problèmes relèvent de différents niveaux de gravité: déboguer, Info, avis, avertir, erreur (c'est le niveau par défaut et fonctionne à l'échelle mondiale), critiquer, alerte, ou émerger.

Le fichier journal par défaut est journal / erreur.enregistrer, Mais il est normalement situé dans / var / log / nginx / sur les distributions Linux. Le error_log La directive est utilisée pour spécifier le fichier journal, et il peut être utilisé dans le contexte principal, HTTP, courrier, flux, serveur, contexte de l'emplacement (dans cet ordre).

Vous devez également noter que:

  • Les configurations dans le contexte principal sont toujours héritées par des niveaux inférieurs dans l'ordre ci-dessus.
  • et les configurations dans les 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 de enregistrer tous les messages de type avertir et un niveau de journal plus sévère critiquer, alerte, et émerger messages.

Dans l'exemple suivant, les messages de critiquer, alerte, et émerger Les niveaux seront enregistrés.

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

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

/ etc / nginx / nginx.confli
http log_format compression '$ Remote_addr - $ Remote_user [$ time_local] "" $ request "$ status $ body_bytes_sent" "$ http_referrer" "$ http_user_ager" "$ gzip_ratio"'; error_log / var / log / nginx / error_log critique; Server écouter 80; SERVER_NAME Exemple1.com; #Ces messages d'erreurs de journaux par exemple1.com uniquement error_log / var / log / nginx / example1.error_log Warn;… server écouter 80; Server_name Exemple2.com; #Ces messages d'erreurs de journaux par exemple2.com uniquement error_log / var / log / nginx / example1.error_log;… .  

Si vous en utilisez plus d'un error_log directives Comme dans la configuration ci-dessous (même niveau), les messages sont écrits à tous les journaux spécifiés.

/ etc / nginx / nginx.confli
Server écouter 80; SERVER_NAME Exemple1.com; error_log / var / www / example1.com / log / error_log Warn; error_log / var / log / nginx / example1.error_log critique;… 

Configuration de la journalisation conditionnelle dans nginx

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

Nous pouvons utiliser le ngx_http_map_module 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 devraient exister dans le contenu HTTP uniquement) spécifient une mappage entre les valeurs source et résultant.

Pour ce type de paramètre, une demande ne sera pas enregistrée si la condition évalue à "0" ou une chaîne vide. Cet exemple exclut les demandes avec les codes d'état HTTP 2xx et 3xx.

/ etc / nginx / nginx.confli
http map $ status $ condition ~ ^ [23] 0; par défaut 1;  serveur Access_log / path / to / access.journal personnalisé si = $ condition;  

Voici un autre exemple utile pour déboguer une application Web dans une phase de développement. Cela ignorera tous les messages et seuls les informations de débogage des journaux.

/ etc / nginx / nginx.confli
 http map $ info $ Debuggable default 0; débogage 1;  Server … Access_log / var / log / nginx / testapp_debug_access_log debug if = $ Debuggable; #logs Autres demandes Access_log / var / log / nginx / testapp_access.journal principal;… .  

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

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