Ricerca nel sito web

Come configurare i formati di accesso personalizzato e di registro degli errori in Nginx


Il server Nginx HTTP ha una fenomenale struttura di registrazione altamente personalizzabile. In questo articolo spiegheremo come configurare i tuoi formati per i log di accesso e di errore per Nginx in Linux.

Lo scopo di questa guida è aiutarti a capire come vengono generati i log, in modo da configurare formati di log personalizzati per scopi di debug, risoluzione dei problemi o analisi di ciò che accade all'interno del tuo server web e delle applicazioni web (come le richieste di tracciamento).

Leggi anche: 4 buoni strumenti di monitoraggio e gestione dei log open source per Linux

Questo articolo è composto da tre sezioni che ti illumineranno sulla configurazione dei registri di accesso/errore e su come abilitare la registrazione condizionale in Nginx.

Configurazione dei log di accesso in Nginx

In Nginx, tutte le richieste del client al server vengono registrate nel log di accesso in un formato specificato utilizzando il modulo ngx_http_log_module.

Il file di registro predefinito è log/access.log (solitamente /var/log/nginx/access_log su sistemi Linux) e il formato predefinito per la registrazione è normalmente quello combinato o principale formato (questo può variare da una distribuzione all'altra).

La direttiva access_log (applicabile in http, server, posizione, se in posizione e limite eccetto contesto) viene utilizzata per impostare il file di registro e la direttiva log_format (applicabile sotto solo contesto http) viene utilizzato per impostare il formato del registro. Il formato del log è descritto da variabili comuni e da variabili generate solo al momento della scrittura del log.

La sintassi per configurare un formato di registro è:

log_format format_name 'set_of_variables_to_define_format';

e la sintassi per configurare il registro degli accessi è:

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

Quello che segue è un estratto dal file di configurazione Nginx predefinito /etc/nginx/nginx.conf su 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;
}

Questo formato di registro produce la seguente voce di registro.

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"

Quello che segue è un altro formato di registrazione utile che utilizziamo per tracciare le richieste alle nostre applicazioni Web utilizzando alcune delle variabili predefinite, soprattutto ha l'ID della richiesta e registra i dettagli sulla posizione del client (paese, codice paese, regione e città).

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

Puoi usarlo in questo modo:

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

Ciò produrrà una voce di registro simile a questa.

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 

Puoi specificare diversi log utilizzando le direttive access_log sullo stesso livello, qui stiamo utilizzando più di un file di log nel contesto 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;
}

Di seguito sono riportati esempi di configurazioni di registrazione più avanzate, utili per i formati di registro che contengono variabili relative alla compressione e per la creazione di file di registro compressi:

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

Configurazione dei log degli errori in Nginx

Nel caso in cui Nginx riscontri dei problemi, registra le informazioni relative nel registro degli errori. Questi problemi rientrano in diversi livelli di gravità: debug, informazioni, avviso, avviso, errore (questo è il livello predefinito e funziona a livello globale), critico, avviso o emerg.

Il file di registro predefinito è log/error.log, ma normalmente si trova in /var/log/nginx/ sulle distribuzioni Linux. La direttiva error_log viene utilizzata per specificare il file di registro e può essere utilizzata nel contesto principale, http, posta, flusso, server, posizione (in quest'ordine).

Dovresti anche notare che:

  • Le configurazioni nel contesto principale vengono sempre ereditate dai livelli inferiori nell'ordine sopra.
  • e le configurazioni nei livelli inferiori sovrascrivono le configurazioni ereditate dai livelli superiori.

È possibile configurare la registrazione degli errori utilizzando la seguente sintassi:

error_log /path/to/log_file log_level;

Per esempio:

error_log /var/log/nginx/error_log warn; 

Ciò istruirà Nginx a registrare tutti i messaggi di tipo warn e i livelli di registro più gravi crit, alert e emerg messaggi.

Nell'esempio successivo verranno registrati i messaggi dei livelli critico, avviso ed emerg.

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

Considera la configurazione seguente, qui abbiamo definito la registrazione degli errori su diversi livelli (nel contesto http e server). In caso di errore, il messaggio viene scritto su un solo log degli errori, quello più vicino al livello in cui si è verificato l'errore.

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

Se utilizzi più di una direttiva error_log come nella configurazione seguente (stesso livello), i messaggi vengono scritti in tutti i log specificati.

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

Configurazione della registrazione condizionale in Nginx

In alcuni casi, potremmo volere che Nginx esegua la registrazione condizionale dei messaggi. Non tutti i messaggi devono essere registrati da Nginx, quindi possiamo ignorare le voci di registro insignificanti o meno importanti dai nostri registri di accesso per istanze particolari.

Possiamo usare il modulo ngx_http_map_module che crea variabili i cui valori dipendono dai valori di altre variabili. I parametri all'interno di un blocco mappa (che dovrebbe esistere solo nel contenuto http) specificano una mappatura tra i valori sorgente e risultanti.

Per questo tipo di impostazione, una richiesta non verrà registrata se la condizione restituisce “0 ” o una stringa vuota. Questo esempio esclude le richieste con codici di stato HTTP 2xx e 3xx.

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

Ecco un altro esempio utile per eseguire il debug di un'applicazione web in fase di sviluppo. Ciò ignorerà tutti i messaggi e registrerà solo le informazioni di debug.

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

Puoi trovare ulteriori informazioni, incluso l'accesso a syslog qui.

È tutto per ora! In questa guida, abbiamo spiegato come configurare un formato di registrazione personalizzato per i log di accesso e di errore in Nginx. Utilizza il modulo di feedback qui sotto per porre domande o condividere le tue opinioni su questo articolo.