Kako konfigurirati prilagođeni pristup i formate dnevnika pogrešaka u Nginxu


Nginx HTTP poslužitelj ima fenomenalnu značajku bilježenja koja je vrlo prilagodljiva. U ovom ćemo članku objasniti kako konfigurirati vlastite formate za zapise pristupa i pogrešaka za Nginx u Linuxu.

Cilj ovog vodiča je pomoći vam da razumijete kako se zapisi generiraju, tako da konfigurirate prilagođene formate dnevnika u svrhu otklanjanja pogrešaka, rješavanja problema ili analize onoga što se odvija unutar vašeg web poslužitelja kao i web aplikacija (kao što su zahtjevi za praćenje).

Pročitajte također: 4 dobra alata za nadzor i upravljanje zapisima otvorenog koda za Linux

Ovaj se članak sastoji od tri odjeljka koji će vas prosvijetliti o konfiguriranju zapisa pristupa/pogreški i kako omogućiti uvjetno zapisivanje u Nginxu.

Konfiguriranje zapisa pristupa u Nginxu

Pod Nginxom, svi zahtjevi klijenata prema poslužitelju bilježe se u zapis pristupa u određenom formatu pomoću modula ngx_http_log_module.

Zadana datoteka dnevnika je log/access.log (obično /var/log/nginx/access_log na Linux sustavima), a zadani format za evidentiranje obično je kombinirani ili glavni formatu (ovo može varirati od jedne distribucije do druge).

Direktiva access_log (primjenjiva na http, poslužitelj, lokacija, ako je na lokaciji i ograničenje osim konteksta) koristi se za postavljanje datoteke dnevnika i direktiva log_format (primjenjiva pod samo http kontekst) koristi se za postavljanje formata dnevnika. Format dnevnika je opisan uobičajenim varijablama, te varijablama koje su generirane samo u trenutku kada je zapisnik zapisan.

Sintaksa za konfiguriranje formata dnevnika je:

log_format format_name 'set_of_variables_to_define_format';

a sintaksa za konfiguriranje dnevnika pristupa je:

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

Slijedi izvadak iz zadane Nginx konfiguracijske datoteke /etc/nginx/nginx.conf na 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;
}

Ovaj format dnevnika daje sljedeći unos dnevnika.

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"

Slijedi još jedan koristan format bilježenja koji koristimo za praćenje zahtjeva za naše web aplikacije koristeći neke od zadanih varijabli, što je najvažnije, ima ID zahtjeva i bilježi pojedinosti o lokaciji klijenta (država, kod zemlje, regija i grad).

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

Možete ga koristiti ovako:

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

Ovo će proizvesti unos dnevnika koji izgleda ovako.

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 

Možete navesti nekoliko zapisa pomoću direktiva access_log na istoj razini, ovdje koristimo više od jedne datoteke dnevnika u http kontekstu.

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

Slijede primjeri naprednijih konfiguracija zapisivanja koji su korisni za formate dnevnika koji sadrže varijable povezane s kompresijom i za stvaranje komprimiranih datoteka dnevnika:

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

Konfiguriranje zapisa pogrešaka u Nginxu

U slučaju da Nginx ima problema, bilježi podatke o njima u zapisnik grešaka. Ovi problemi spadaju pod različite razine ozbiljnosti: otklanjanje pogrešaka, informacije, obavijest, upozorenje, pogreška (ovo je zadana razina i radi globalno), crit, alert ili emerg.

Zadana datoteka dnevnika je log/error.log, ali se obično nalazi u /var/log/nginx/ u distribucijama Linuxa. Direktiva error_log koristi se za određivanje datoteke dnevnika i može se koristiti u glavnom, http, mail, stream, poslužiteljskom, lokacijskom kontekstu (tim redoslijedom).

Također biste trebali imati na umu da:

  • Konfiguracije u glavnom kontekstu uvijek nasljeđuju niže razine u gornjem redoslijedu.
  • a konfiguracije na nižim razinama nadjačavaju konfiguracije naslijeđene s viših razina.

Zapisivanje pogrešaka možete konfigurirati pomoću sljedeće sintakse:

error_log /path/to/log_file log_level;

Na primjer:

error_log /var/log/nginx/error_log warn; 

Ovo će uputiti Nginx da zabilježi sve poruke tipa warn i ozbiljniju razinu zapisnika crit, alert i emerg poruke.

U sljedećem primjeru, poruke razine kritičke, upozorenje i nužde bit će zabilježene.

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

Razmotrite donju konfiguraciju, ovdje smo definirali bilježenje pogrešaka na različitim razinama (u http i kontekstu poslužitelja). U slučaju greške, poruka se upisuje samo u jedan dnevnik grešaka, onaj koji je najbliži razini na kojoj se greška pojavila.

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

Ako koristite više od jedne direktive error_log kao u konfiguraciji ispod (ista razina), poruke se zapisuju u sve navedene zapise.

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

Konfiguriranje uvjetnog zapisivanja u Nginxu

U nekim slučajevima, možda ćemo željeti da Nginx izvrši uvjetno zapisivanje poruka. Nginx ne mora svaku poruku zabilježiti, stoga možemo zanemariti beznačajne ili manje važne unose iz naših pristupnih zapisa za određene instance.

Možemo koristiti modul ngx_http_map_module koji stvara varijable čije vrijednosti ovise o vrijednostima drugih varijabli. Parametri unutar bloka karte (koji bi trebao postojati samo u http sadržaju) određuju mapiranje između izvornih i rezultirajućih vrijednosti.

Za ovu vrstu postavke, zahtjev se neće zabilježiti ako je vrijednost uvjeta “0” ili prazan niz. Ovaj primjer isključuje zahtjeve s HTTP statusnim kodovima 2xx i 3xx.

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

Evo još jednog korisnog primjera za otklanjanje pogrešaka web aplikacije u fazi razvoja. Ovo će zanemariti sve poruke i samo zabilježiti informacije o otklanjanju pogrešaka.

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

Ovdje možete saznati više informacija, uključujući prijavu na syslog.

To je sve za sada! U ovom smo vodiču objasnili kako konfigurirati prilagođeni format zapisnika za zapisnike pristupa i pogrešaka u Nginxu. Upotrijebite obrazac za povratne informacije u nastavku da biste postavili pitanja ili podijelili svoje mišljenje o ovom članku.