Hvordan konfigurere tilpasset tilgang og feilloggformater i Nginx


Nginx HTTP-serveren har en fenomenal loggingsfunksjon som er svært tilpassbar. I denne artikkelen vil vi forklare hvordan du konfigurerer dine egne formater for tilgang og feillogger for Nginx i Linux.

Målet med denne veiledningen er å hjelpe deg med å forstå hvordan logger genereres, slik at du kan konfigurere tilpassede loggformater for feilsøking, feilsøking eller analyse av hva som utspiller seg på nettserveren din, så vel som nettapplikasjoner (for eksempel sporingsforespørsler).

Les også: 4 gode loggovervåkings- og administrasjonsverktøy for åpen kildekode for Linux

Denne artikkelen består av tre deler som vil opplyse deg om hvordan du konfigurerer tilgangs-/feillogger og hvordan du aktiverer betinget logging i Nginx.

Konfigurere tilgangslogger i Nginx

Under Nginx blir alle klientforespørsler til serveren lagret i tilgangsloggen i et spesifisert format ved å bruke ngx_http_log_module-modulen.

Standard loggfil er log/access.log (vanligvis /var/log/nginx/access_log på Linux-systemer) og standardformatet for logging er vanligvis det kombinerte eller hovedformatet. format (dette kan variere fra en distro til en annen).

access_log-direktivet (gjelder i http, server, plassering, hvis i plassering og limit unntatt kontekst) brukes til å angi loggfilen og log_format-direktivet (gjelder under http-kontekst) brukes til å angi loggformatet. Loggformatet er beskrevet av vanlige variabler og variabler som kun genereres på det tidspunktet en logg skrives.

Syntaksen for å konfigurere et loggformat er:

log_format format_name 'set_of_variables_to_define_format';

og syntaksen for å konfigurere tilgangsloggen 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 utdrag fra standard Nginx-konfigurasjonsfilen /etc/nginx/nginx.confCentOS 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 loggformatet gir følgende loggoppføring.

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 annet nyttig loggingsformat som vi bruker for å spore forespørsler til nettapplikasjonene våre ved å bruke noen av standardvariablene, det viktigste har forespørsels-IDen og logger klientposisjonsdetaljer (land, landskode, 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 bruke det slik:

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

Dette vil produsere en loggoppføring som ser slik ut.

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 spesifisere flere logger ved å bruke access_log-direktivene på samme nivå, her bruker vi mer enn én loggfil i http-konteksten.

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 eksempler på mer avanserte loggingskonfigurasjoner, som er nyttige for loggformater som inneholder komprimeringsrelaterte variabler og for å lage komprimerte loggfiler:

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

Konfigurering av feillogger i Nginx

I tilfelle Nginx opplever noen feil, registrerer den informasjon om dem i feilloggen. Disse problemene faller under ulike alvorlighetsnivåer: feilsøking, info, varsel, advarsel, feil (dette er standardnivået og fungerer globalt), crit, alert eller emerg.

Standard loggfil er log/error.log, men den er normalt plassert i /var/log/nginx/ på Linux-distribusjoner. error_log-direktivet brukes til å spesifisere loggfilen, og den kan brukes i hoved-, http-, e-post-, stream-, server-, plasseringskontekst (i den rekkefølgen).

Du bør også merke deg at:

  • Konfigurasjoner i hovedkonteksten arves alltid av lavere nivåer i rekkefølgen ovenfor.
  • og konfigurasjoner på de lavere nivåene overstyrer konfigurasjonene som er arvet fra de høyere nivåene.

Du kan konfigurere feillogging ved å bruke 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 å logge alle meldinger av typen advarsel og mer alvorlig loggnivå crit, alert og emerg meldinger.

I det neste eksemplet vil meldinger på nivåene krit, alarm og emerg bli logget.

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

Tenk på konfigurasjonen nedenfor, her har vi definert feillogging på forskjellige nivåer (i http- og serverkonteksten). Ved feil skrives meldingen til kun én feillogg, den som er nærmest nivået der feilen har oppstått.

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 bruker mer enn ett error_log-direktiv som i konfigurasjonen nedenfor (samme nivå), blir meldingene skrevet til alle spesifiserte logger.

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

Konfigurere betinget logging i Nginx

I noen tilfeller vil vi kanskje at Nginx skal utføre betinget logging av meldinger. Ikke alle meldinger må logges av Nginx, derfor kan vi ignorere ubetydelige eller mindre viktige loggoppføringer fra tilgangsloggene våre for bestemte tilfeller.

Vi kan bruke ngx_http_map_module-modulen som lager variabler hvis verdier avhenger av verdier til andre variabler. Parametrene inne i en kartblokk (som bare skal eksistere i http-innholdet) spesifiserer en tilordning mellom kilde- og resulterende verdier.

For denne typen innstilling vil en forespørsel ikke logges hvis betingelsen evalueres til “0 ” eller en tom streng. Dette eksemplet ekskluderer forespørsler 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 annet nyttig eksempel for feilsøking av en webapplikasjon i en utviklingsfase. Dette vil ignorere alle meldinger og bare logge feilsøkingsinformasjon.

 
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 finne ut mer informasjon, inkludert logging til syslog her.

Det er alt for nå! I denne veiledningen forklarte vi hvordan du konfigurerer tilpasset loggingsformat for tilgangs- og feillogger i Nginx. Bruk tilbakemeldingsskjemaet nedenfor for å stille spørsmål eller dele dine tanker om denne artikkelen.