Sådan konfigureres brugerdefinerede adgangs- og fejllogformater i Nginx


Nginx HTTP-server har en fænomenal logningsfacilitet, som er meget tilpasselig. I denne artikel vil vi forklare, hvordan du konfigurerer dine egne formater til adgangs- og fejllogfiler til Nginx i Linux.

Målet med denne vejledning er at hjælpe dig med at forstå, hvordan logfiler genereres, således at konfigurere brugerdefinerede logformater med henblik på fejlfinding, fejlfinding eller analyse af, hvad der udfolder sig inden på din webserver samt webapplikationer (såsom sporingsanmodninger).

Denne artikel er lavet af tre sektioner, der vil oplyse dig om konfiguration af adgangs-/fejllogfiler, og hvordan du aktiverer betinget logføring i Nginx.

Konfiguration af adgangslogfiler i Nginx

Under Nginx gendannes alle klientanmodninger til serveren i adgangsloggen i et bestemt format ved hjælp af modulet ngx_http_log_module.

Standardlogfilen er log/access.log (normalt/var/log/nginx/access_log på Linux-systemer), og standardformatet til logning er normalt det kombinerede eller hovedformat (dette kan variere fra en distro til en anden).

Access_log-direktivet (anvendeligt i http, server, placering, hvis det er i placering og grænse undtagen kontekst) bruges til at indstille logfilen, og log_format-direktivet (gælder kun under http-konteksten) bruges til at indstille logformatet. Logformatet er beskrevet af almindelige variabler og variabler, der kun genereres på det tidspunkt, hvor en log er skrevet.

Syntaksen til konfiguration af et logformat er:

log_format format_name 'set_of_variables_to_define_format';

og syntaksen til konfiguration af adgangslog er:

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

Følgende er et uddrag fra standard Nginx-konfigurationsfilen /etc/nginx/nginx.conf på 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;
}

Dette logformat giver følgende logindgang.

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"

Følgende er et andet nyttigt logningsformat, som vi bruger til at spore anmodninger til vores webapplikationer ved hjælp af nogle af standardvariablerne, det vigtigste har anmodnings-id'et og logger klientplaceringsoplysninger (land, landekode, region og by).

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

Du kan bruge det på denne måde:

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

Dette vil producere en logindgang, der ser sådan ud.

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 

Du kan angive flere logfiler ved hjælp af access_log-direktiverne på samme niveau, her bruger vi mere end en logfil i http-sammenhæng.

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

Følgende er mere avancerede logningskonfigurationseksempler, som er nyttige til logformater, der indeholder kompressionsrelaterede variabler og til oprettelse af komprimerede logfiler:

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

Konfiguration af fejllogfiler i Nginx

Hvis Nginx oplever fejl, registrerer den information om dem i fejlloggen. Disse problemer falder under forskellige sværhedsgrader: fejlretning, info, meddelelse, advarsel, fejl (dette er standardniveauet og fungerer globalt), kritik, alarm eller opstå.

Standardlogfilen er log/error.log, men den er normalt placeret i/var/log/nginx/på Linux-distributioner. Error_log-direktivet bruges til at specificere logfilen, og den kan bruges i hoved-, http-, mail-, stream-, server-, placeringskontekst (i den rækkefølge).

Du skal også bemærke, at:

  • Konfigurationer i hovedkonteksten nedarves altid af lavere niveauer i ovenstående rækkefølge.
  • og konfigurationer i de lavere niveauer tilsidesætter de konfigurationer, der er arvet fra de højere niveauer.

Du kan konfigurere fejllogning ved hjælp af følgende syntaks:

error_log /path/to/log_file log_level;

For eksempel:

error_log /var/log/nginx/error_log warn; 

Dette vil instruere Nginx om at logge alle meddelelser af typen advarsler og mere alvorlige logniveau kritikere, advarsler og nye meddelelser.

I det næste eksempel logges beskeder om kritik-, alarm- og nye niveauer.

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

Overvej konfigurationen nedenfor, her har vi defineret fejllogning på forskellige niveauer (i http- og serverkontekst). I tilfælde af en fejl skrives meddelelsen til kun en fejllog, den nærmeste det niveau, hvor fejlen er opstået.

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

Hvis du bruger mere end et error_log-direktiv som i konfigurationen nedenfor (samme niveau), skrives meddelelserne til alle angivne logfiler.

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

Konfiguration af betinget logning i Nginx

I nogle tilfælde vil vi muligvis have Nginx til at udføre betinget logning af meddelelser. Ikke alle meddelelser skal logges af Nginx, derfor kan vi ignorere ubetydelige eller mindre vigtige logposter fra vores adgangslogger til bestemte tilfælde.

Vi kan bruge ngx_http_map_module-modulet, der opretter variabler, hvis værdier afhænger af værdierne for andre variabler. Parametrene inde i en kortblok (som kun skal findes i http-indholdet) angiver en kortlægning mellem kilde og resulterende værdier.

For denne type indstilling logges en anmodning ikke, hvis betingelsen evalueres til “0” eller en tom streng. Dette eksempel udelukker anmodninger med HTTP-statuskoder 2xx og 3xx.

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

Her er et andet nyttigt eksempel til fejlfinding af en webapplikation i en udviklingsfase. Dette ignorerer alle meddelelser og logger kun fejlretningsoplysninger.

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

Du kan finde ud af mere information, herunder logning til syslog her.

Det er alt for nu! I denne vejledning forklarede vi, hvordan du konfigurerer brugerdefineret logningsformat til adgangs- og fejllogfiler i Nginx. Brug feedbackformularen nedenfor til at stille spørgsmål eller dele dine tanker om denne artikel.