Zoeken op website

Aangepaste toegangs- en foutenlogboekformaten configureren in Nginx


Nginx HTTP-server heeft een fenomenale logfunctie die in hoge mate aanpasbaar is. In dit artikel leggen we uit hoe u uw eigen formaten voor toegang en foutenlogboeken voor Nginx in Linux kunt configureren.

Het doel van deze handleiding is om u te helpen begrijpen hoe logs worden gegenereerd, zodat u aangepaste logformaten kunt configureren voor foutopsporing, probleemoplossing of analyse van wat zich binnen uw webserver en webapplicaties afspeelt (zoals traceringsverzoeken).

Lees ook: 4 goede open source logbewakings- en beheertools voor Linux

Dit artikel bestaat uit drie secties die u zullen informeren over het configureren van toegangs-/foutlogboeken en hoe u voorwaardelijke logboekregistratie in Nginx kunt inschakelen.

Toegangslogboeken configureren in Nginx

Onder Nginx worden alle clientverzoeken aan de server vastgelegd in het toegangslog in een gespecificeerd formaat met behulp van de ngx_http_log_module module.

Het standaard logbestand is log/access.log (meestal /var/log/nginx/access_log op Linux-systemen) en het standaardformaat voor loggen is normaal gesproken het gecombineerde of hoofdformaat formaat (dit kan variëren van de ene distributie naar de andere).

De access_log richtlijn (van toepassing op http, server, locatie, indien in locatie en limiet behalve context) wordt gebruikt om het logbestand in te stellen en de log_format richtlijn (van toepassing onder de alleen http-context) wordt gebruikt om het logformaat in te stellen. Het logformaat wordt beschreven door algemene variabelen en door variabelen die alleen worden gegenereerd op het moment dat een log wordt geschreven.

De syntaxis voor het configureren van een logformaat is:

log_format format_name 'set_of_variables_to_define_format';

en de syntaxis voor het configureren van het toegangslogboek is:

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

Het volgende is een fragment uit het standaard Nginx-configuratiebestand /etc/nginx/nginx.conf op 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;
}

Dit logformaat levert de volgende loginvoer op.

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"

Het volgende is een ander handig logformaat dat we gebruiken voor het traceren van verzoeken aan onze webapplicaties met behulp van enkele standaardvariabelen. Het belangrijkste is dat het de verzoek-ID bevat en de locatiegegevens van de klant registreert (land, landcode, regio en stad).

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

Je kunt het als volgt gebruiken:

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

Dit zal een logboekinvoer produceren die er als volgt uitziet.

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 

U kunt meerdere logbestanden specificeren met behulp van de access_log richtlijnen op hetzelfde niveau. Hier gebruiken we meer dan één logbestand in de http-context.

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

Hieronder volgen meer geavanceerde voorbeelden van logconfiguraties, die handig zijn voor logformaten die compressiegerelateerde variabelen bevatten en voor het maken van gecomprimeerde logbestanden:

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

Foutlogboeken configureren in Nginx

In het geval dat Nginx problemen ondervindt, registreert het informatie hierover in het foutenlogboek. Deze problemen vallen onder verschillende ernstniveaus: debug, info, notice, warn, error (dit is het standaardniveau en werkt wereldwijd), crit, alert of emerg.

Het standaard logbestand is log/error.log, maar bevindt zich normaal gesproken in /var/log/nginx/ op Linux-distributies. De error_log richtlijn wordt gebruikt om het logbestand te specificeren en kan worden gebruikt in de hoofd-, http-, mail-, stream-, server- en locatiecontext (in die volgorde).

Houd er ook rekening mee dat:

  • Configuraties in de hoofdcontext worden altijd overgenomen door lagere niveaus in de bovenstaande volgorde.
  • en configuraties op de lagere niveaus overschrijven de configuraties die zijn geërfd van de hogere niveaus.

U kunt foutregistratie configureren met behulp van de volgende syntaxis:

error_log /path/to/log_file log_level;

Bijvoorbeeld:

error_log /var/log/nginx/error_log warn; 

Dit zal Nginx instrueren om alle berichten van het type warn en zwaardere logniveaus crit, alert en emerg te loggen berichten.

In het volgende voorbeeld worden berichten van het niveau crit, alert en emerg geregistreerd.

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

Beschouw de onderstaande configuratie, hier hebben we foutregistratie op verschillende niveaus gedefinieerd (in de http- en servercontext). In geval van een fout wordt het bericht slechts naar één foutenlogboek geschreven, het logbestand dat het dichtst bij het niveau ligt waar de fout is opgetreden.

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

Als u meer dan één error_log-richtlijnen gebruikt, zoals in de onderstaande configuratie (hetzelfde niveau), worden de berichten naar alle opgegeven logs geschreven.

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

Voorwaardelijke logboekregistratie configureren in Nginx

In sommige gevallen willen we misschien dat Nginx voorwaardelijke logboekregistratie van berichten uitvoert. Niet elk bericht hoeft door Nginx te worden geregistreerd, daarom kunnen we onbeduidende of minder belangrijke loggegevens uit onze toegangslogboeken voor bepaalde instanties negeren.

We kunnen de ngx_http_map_module module gebruiken die variabelen creëert waarvan de waarden afhangen van de waarden van andere variabelen. De parameters binnen een kaartblok (die alleen in de http-inhoud zouden moeten voorkomen) specificeren een toewijzing tussen bron- en resulterende waarden.

Bij dit soort instellingen wordt er geen verzoek geregistreerd als de voorwaarde resulteert in “0 ” of een lege tekenreeks. In dit voorbeeld zijn verzoeken met HTTP-statuscodes 2xx en 3xx uitgesloten.

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

Hier is nog een nuttig voorbeeld voor het debuggen van een webapplicatie in een ontwikkelingsfase. Hierdoor worden alle berichten genegeerd en wordt alleen foutopsporingsinformatie geregistreerd.

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

Meer informatie, inclusief inloggen op syslog, vindt u hier.

Dat is het voor nu! In deze handleiding hebben we uitgelegd hoe u een aangepast logboekformaat voor toegangs- en foutlogboeken in Nginx kunt configureren. Gebruik het onderstaande feedbackformulier om vragen te stellen of uw mening over dit artikel te delen.