Wéi konfiguréieren Custom Access a Feeler Log Formater an Nginx


Nginx HTTP-Server huet eng phänomenal Loggingsanlag déi héich personaliséierbar ass. An dësem Artikel wäerte mir erkläre wéi Dir Är eege Formater fir Zougang a Feelerprotokoller fir Nginx am Linux konfiguréiert.

D'Zil vun dësem Guide ass Iech ze hëllefen ze verstoen wéi Logbicher generéiert ginn, fir personaliséiert Logformate fir Zwecker vum Debugging, Problembehandlung oder Analyse ze konfiguréieren wat sech an Ärem Webserver entwéckelt, souwéi Webapplikatiounen (wéi Tracing-Ufroen).

Dësen Artikel ass aus dräi Sektiounen gemaach, déi Iech erliichteren iwwer d'Konfiguratioun vun Zougang/Fehler Logbicher a wéi Dir bedingte Logbicher an Nginx aktivéiert.

Zougang Logbicher an Nginx konfiguréieren

Ënner Nginx ginn all Client Ufroe fir de Server am Zougangsprotokoll an engem spezifizéierte Format opgeholl mat dem ngx_http_log_module Modul.

D'Standard Log Datei ass log/access.log (normalerweis /var/log/nginx/access_log op Linux Systemer) an d'Standardformat fir d'Logbuch ass normalerweis de kombinéierten oder Haaptformat (dëst kann vun engem Distro zu engem aneren variéieren).

D'Access_log-Direktiv (applicabel am http, Server, Standuert, wann an der Plaz a Limit ausser Kontext) gëtt benotzt fir d'Logdatei ze setzen an d'Log_format-Direktiv (nëmmen applicabel ënner dem http Kontext) gëtt benotzt fir de Logformat ze setzen. De Logformat gëtt duerch allgemeng Variablen beschriwwen, a Variablen déi nëmmen zur Zäit generéiert ginn wann e Log geschriwwe gëtt.

D'Syntax fir e Logformat ze konfiguréieren ass:

log_format format_name 'set_of_variables_to_define_format';

an d'Syntax fir den Zougangsprotokoll ze konfiguréieren ass:

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

Déi folgend ass en Auszuch aus der Standard Nginx Konfiguratiounsdatei /etc/nginx/nginx.conf op 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;
}

Dëse Log-Format bréngt de folgende Log-Entrée.

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"

Déi folgend ass en anert nëtzlecht Logformat dee mir benotze fir Ufroen op eis Webapplikatiounen ze verfollegen andeems Dir e puer vun de Standardvariablen benotzt, et huet am wichtegsten d'Ufro ID a protokolléiert Clientsplaz Detailer (Land, Landcode, Regioun a Stad).

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

Dir kënnt et esou benotzen:

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

Dëst wäert e Log-Entrée produzéieren deen esou erschéngt.

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 

Dir kënnt verschidde Logbicher spezifizéieren mat den Access_log Direktiven um selwechten Niveau, hei benotze mir méi wéi eng Logdatei am http Kontext.

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

Déi folgend sinn méi fortgeschratt Protokollkonfiguratiounsbeispiller, déi nëtzlech si fir Logformater déi kompressiounsrelatéiert Variablen enthalen a fir kompriméiert Logdateien ze kreéieren:

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

Konfiguréieren Feeler Logbicher an Nginx

Am Fall wou Nginx Feeler erliewt, registréiert se Informatioun iwwer si am Feelerprotokoll. Dës Themen falen ënner verschiddene Schwieregkeetsniveauen: Debug, Info, Notiz, Warnung, Fehler (dëst ass de Standardniveau a funktionnéiert weltwäit), Crit, Alarm oder Emerg.

D'Standard Log Datei ass log/error.log, awer et ass normalerweis an /var/log/nginx/ op Linux Verdeelungen. D'Error_log Direktiv gëtt benotzt fir d'Logbuchdatei ze spezifizéieren, an et kann am Haapt, http, Mail, Stream, Server, Standuert Kontext (an dëser Reiefolleg) benotzt ginn.

Dir sollt och bemierken datt:

  • Konfiguratiounen am Haaptkontext ginn ëmmer vun méi nidderegen Niveauen an der Uerdnung hei uewen ierf.
  • an Konfiguratiounen an den ënneschten Niveauen iwwerschreiden d'Konfiguratiounen, déi vun de méi héijen Niveauen ierflecher sinn.

Dir kënnt Fehlerprotokoller konfiguréieren mat der folgender Syntax:

error_log /path/to/log_file log_level;

Zum Beispill:

error_log /var/log/nginx/error_log warn; 

Dëst wäert Nginx instruéieren all Messagen vum Typ Warnung a méi schwéiere Logniveau Crit, Alarm, an Emerg Messagen ze protokolléieren.

Am nächste Beispill ginn Messagen vu Krit, Alarm an Entstoe Niveauen protokolléiert.

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

Bedenkt d'Konfiguratioun hei drënner, hei hu mir Fehlerprotokoller op verschiddene Niveauen definéiert (am http a Server Kontext). Am Fall vun engem Feeler gëtt de Message nëmmen op ee Feelerprotokoll geschriwwe, deen am nootsten um Niveau wou de Feeler opgetaucht ass.

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

Wann Dir méi wéi ee error_log Direktiven benotzt wéi an der Konfiguratioun hei drënner (selwescht Niveau), ginn d'Messagen op all spezifizéiert Logbicher geschriwwe.

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 Conditional Logging an Nginx

An e puer Fäll kënne mir Nginx wëlle bedingungsprotokolle vu Messagen ausféieren. Net all Message muss vum Nginx protokolléiert ginn, dofir kënne mir onbedeitend oder manner wichteg Logbicher aus eisen Zougangsprotokoller fir bestëmmte Fäll ignoréieren.

Mir kënnen den ngx_http_map_module Modul benotzen deen Variablen erstellt, deenen hir Wäerter op Wäerter vun anere Variablen hänken. D'Parameteren an engem Kaartblock (deen nëmmen am http Inhalt sollt existéieren) spezifizéieren eng Mapping tëscht Quell a resultéierend Wäerter.

Fir dës Zort Astellung gëtt eng Ufro net protokolléiert wann d'Konditioun op \0 evaluéiert oder eng eidel String. Dëst Beispill schléisst Ufroe mat HTTP-Statuscoden 2xx an 3xx aus.

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

Hei ass en anert nëtzlecht Beispill fir eng Webapplikatioun an enger Entwécklungsphase ze Debuggéieren. Dëst wäert all Messagen ignoréieren an nëmmen Debug Informatioun aloggen.

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

Dir kënnt méi Informatiounen erausfannen, dorënner Logged op Syslog hei.

Dat ass alles fir elo! An dësem Guide hu mir erkläert wéi ee personaliséierte Logformat fir Zougang a Feeler Logbicher an Nginx konfiguréiert. Benotzt de Feedbackformular hei ënnen fir Froen ze stellen oder Är Gedanken iwwer dësen Artikel ze deelen.