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.