Cum se configurează accesul personalizat și formatele jurnalului de erori în Nginx


Serverul Nginx HTTP are o facilitate de înregistrare fenomenală, care este foarte personalizabilă. În acest articol, vă vom explica cum să vă configurați propriile formate pentru jurnalele de acces și erori pentru Nginx în Linux.

Scopul acestui ghid este de a vă ajuta să înțelegeți cum sunt generate jurnalele, astfel încât să configurați formate personalizate de jurnal în scopul depanării, depanării sau analizei a ceea ce se întâmplă în serverul dvs. web, precum și în aplicațiile web (cum ar fi solicitările de urmărire).

Citiți și: 4 instrumente bune de monitorizare și gestionare a jurnalelor open source pentru Linux

Acest articol este format din trei secțiuni care vă vor lumina despre configurarea jurnalelor de acces/erori și despre cum să activați înregistrarea condiționată în Nginx.

Configurarea jurnalelor de acces în Nginx

Sub Nginx, toate solicitările clientului către server sunt înregistrate în jurnalul de acces într-un format specificat, utilizând modulul ngx_http_log_module.

Fișierul jurnal implicit este log/access.log (de obicei /var/log/nginx/access_log pe sistemele Linux) și formatul implicit pentru înregistrare este în mod normal combinat sau principal format (acesta poate varia de la o distribuție la alta).

Directiva access_log (aplicabilă în http, server, locație, dacă se află în locație și limită, cu excepția contextului) este utilizată pentru a seta fișierul jurnal și directiva log_format (aplicabilă în conformitate cu Numai contextul http) este utilizat pentru a seta formatul jurnalului. Formatul jurnalului este descris de variabile comune și variabile care au fost generate numai în momentul în care este scris un jurnal.

Sintaxa pentru configurarea unui format de jurnal este:

log_format format_name 'set_of_variables_to_define_format';

iar sintaxa pentru configurarea jurnalului de acces este:

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

Următorul este un extras din fișierul de configurare Nginx implicit /etc/nginx/nginx.conf pe 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;
}

Acest format de jurnal produce următoarea intrare de jurnal.

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"

Următorul este un alt format de înregistrare util pe care îl folosim pentru urmărirea cererilor către aplicațiile noastre web folosind unele dintre variabilele implicite, cel mai important are ID-ul cererii și înregistrează detaliile locației clientului (țară, cod de țară, regiune și oraș).

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

Îl poți folosi astfel:

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

Aceasta va produce o intrare de jurnal care va apărea astfel.

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 

Puteți specifica mai multe jurnale folosind directivele access_log la același nivel, aici folosim mai multe fișiere jurnal în contextul 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;
}

Următoarele sunt exemple de configurații de înregistrare mai avansate, care sunt utile pentru formatele de jurnal care conțin variabile legate de compresie și pentru crearea fișierelor jurnal comprimate:

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

Configurarea jurnalelor de erori în Nginx

În cazul în care Nginx întâmpină probleme, înregistrează informații despre acestea în jurnalul de erori. Aceste probleme se încadrează în diferite niveluri de severitate: remediere, informații, notificare, avertizare, eroare (acesta este nivelul prestabilit și funcționează la nivel global), crit, alertă sau emerg.

Fișierul jurnal implicit este log/error.log, dar se află în mod normal în /var/log/nginx/ pe distribuțiile Linux. Directiva error_log este utilizată pentru a specifica fișierul jurnal și poate fi utilizată în contextul principal, http, mail, flux, server, locație (în această ordine).

De asemenea, ar trebui să rețineți că:

  • Configurațiile din contextul principal sunt întotdeauna moștenite de nivelurile inferioare în ordinea de mai sus.
  • iar configurațiile din nivelurile inferioare suprascrie configurațiile moștenite de la nivelurile superioare.

Puteți configura înregistrarea erorilor folosind următoarea sintaxă:

error_log /path/to/log_file log_level;

De exemplu:

error_log /var/log/nginx/error_log warn; 

Acest lucru va instrui Nginx să înregistreze toate mesajele de tipul avertisment și la nivel de jurnal mai sever crit, alertă și emerg mesaje.

În exemplul următor, vor fi înregistrate mesajele de nivel crit, alertă și emerg.

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

Luați în considerare configurația de mai jos, aici, am definit înregistrarea erorilor pe diferite niveluri (în contextul http și server). În cazul unei erori, mesajul este scris într-un singur jurnal de erori, cel mai apropiat de nivelul în care a apărut eroarea.

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

Dacă utilizați mai multe directive error_log ca în configurația de mai jos (același nivel), mesajele sunt scrise în toate jurnalele specificate.

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

Configurarea înregistrării condiționate în Nginx

În unele cazuri, putem dori ca Nginx să efectueze înregistrarea condiționată a mesajelor. Nu fiecare mesaj trebuie să fie înregistrat de Nginx, prin urmare putem ignora intrările de jurnal nesemnificative sau mai puțin importante din jurnalele noastre de acces pentru anumite cazuri.

Putem folosi modulul ngx_http_map_module care creează variabile ale căror valori depind de valorile altor variabile. Parametrii din interiorul unui bloc de hartă (care ar trebui să existe doar în conținutul http) specifică o mapare între valorile sursă și cele rezultate.

Pentru acest tip de setare, o solicitare nu va fi înregistrată dacă condiția evaluează la „0 ” sau un șir gol. Acest exemplu exclude solicitările cu codurile de stare HTTP 2xx și 3xx.

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

Iată un alt exemplu util pentru depanarea unei aplicații web într-o fază de dezvoltare. Acest lucru va ignora toate mesajele și va înregistra doar informațiile de depanare.

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

Puteți afla mai multe informații, inclusiv conectarea la syslog aici.

Asta este tot pentru acum! În acest ghid, am explicat cum să configurați formatul personalizat de înregistrare pentru jurnalele de acces și erori în Nginx. Folosiți formularul de feedback de mai jos pentru a pune întrebări sau a vă împărtăși părerile despre acest articol.