Website-Suche

So konfigurieren Sie benutzerdefinierte Zugriffs- und Fehlerprotokollformate in Nginx


Der Nginx HTTP-Server verfügt über eine phänomenale Protokollierungsfunktion, die in hohem Maße anpassbar ist. In diesem Artikel erklären wir, wie Sie Ihre eigenen Formate für Zugriffs- und Fehlerprotokolle für Nginx unter Linux konfigurieren.

Ziel dieses Leitfadens ist es, Ihnen zu helfen, zu verstehen, wie Protokolle generiert werden, um benutzerdefinierte Protokollformate zum Debuggen, zur Fehlerbehebung oder zur Analyse der Vorgänge auf Ihrem Webserver und in Webanwendungen (z. B. Tracing-Anfragen) zu konfigurieren.

Lesen Sie auch: 4 gute Open-Source-Tools zur Protokollüberwachung und -verwaltung für Linux

Dieser Artikel besteht aus drei Abschnitten, die Sie über die Konfiguration von Zugriffs-/Fehlerprotokollen und die Aktivierung der bedingten Protokollierung in Nginx informieren.

Konfigurieren von Zugriffsprotokollen in Nginx

Unter Nginx werden alle Client-Anfragen an den Server mithilfe des ngx_http_log_module-Moduls in einem angegebenen Format im Zugriffsprotokoll aufgezeichnet.

Die Standardprotokolldatei ist log/access.log (normalerweise /var/log/nginx/access_log auf Linux-Systemen) und das Standardformat für die Protokollierung ist normalerweise das Combined- oder Main-Format Format (dies kann von einer Distribution zur anderen variieren).

Die access_log-Direktive (anwendbar in http, Server, Standort, wenn in Standort und Limit außer Kontext) wird verwendet, um die Protokolldatei festzulegen, und die log_format-Direktive (anwendbar unter (nur http-Kontext) wird zum Festlegen des Protokollformats verwendet. Das Protokollformat wird durch allgemeine Variablen und Variablen beschrieben, die nur zum Zeitpunkt des Schreibens eines Protokolls generiert werden.

Die Syntax zum Konfigurieren eines Protokollformats lautet:

log_format format_name 'set_of_variables_to_define_format';

und die Syntax zum Konfigurieren des Zugriffsprotokolls lautet:

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

Das Folgende ist ein Auszug aus der Standard-Nginx-Konfigurationsdatei /etc/nginx/nginx.conf unter 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;
}

Dieses Protokollformat ergibt den folgenden Protokolleintrag.

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"

Das Folgende ist ein weiteres nützliches Protokollierungsformat, das wir zum Verfolgen von Anfragen an unsere Webanwendungen mithilfe einiger Standardvariablen verwenden. Es enthält vor allem die Anfrage-ID und protokolliert die Standortdetails des Kunden (Land, Ländercode, Region und Stadt).

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

Sie können es so verwenden:

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

Dadurch wird ein Protokolleintrag erstellt, der wie folgt aussieht.

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 

Sie können mehrere Protokolle mithilfe der access_log-Direktiven auf derselben Ebene angeben. Hier verwenden wir mehr als eine Protokolldatei im http-Kontext.

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

Im Folgenden finden Sie Beispiele für erweiterte Protokollierungskonfigurationen, die für Protokollformate nützlich sind, die komprimierungsbezogene Variablen enthalten, und zum Erstellen komprimierter Protokolldateien:

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

Konfigurieren von Fehlerprotokollen in Nginx

Falls bei Nginx Störungen auftreten, werden entsprechende Informationen im Fehlerprotokoll aufgezeichnet. Diese Probleme fallen in verschiedene Schweregrade: debug, info, notice, warn, error (dies ist die Standardstufe und funktioniert global), crit, alert oder emerg.

Die Standardprotokolldatei ist log/error.log, bei Linux-Distributionen befindet sie sich jedoch normalerweise unter /var/log/nginx/. Die error_log-Direktive wird zur Angabe der Protokolldatei verwendet und kann im Haupt-, http-, Mail-, Stream-, Server- und Standortkontext (in dieser Reihenfolge) verwendet werden.

Sie sollten außerdem Folgendes beachten:

  • Konfigurationen im Hauptkontext werden immer in der oben genannten Reihenfolge an niedrigere Ebenen vererbt.
  • und Konfigurationen in den unteren Ebenen überschreiben die von den höheren Ebenen geerbten Konfigurationen.

Sie können die Fehlerprotokollierung mit der folgenden Syntax konfigurieren:

error_log /path/to/log_file log_level;

Zum Beispiel:

error_log /var/log/nginx/error_log warn; 

Dadurch wird Nginx angewiesen, alle Meldungen vom Typ warn und die schwerwiegenderen Protokollstufen crit, alert und emerg zu protokollieren Mitteilungen.

Im nächsten Beispiel werden Meldungen der Stufen crit, alert und emerg protokolliert.

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

Betrachten Sie die folgende Konfiguration. Hier haben wir die Fehlerprotokollierung auf verschiedenen Ebenen definiert (im http- und Serverkontext). Im Fehlerfall wird die Nachricht nur in ein Fehlerprotokoll geschrieben, und zwar in dasjenige, das der Ebene am nächsten liegt, auf der der Fehler aufgetreten ist.

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

Wenn Sie mehr als eine error_log-Direktive wie in der Konfiguration unten (gleiche Ebene) verwenden, werden die Meldungen in alle angegebenen Protokolle geschrieben.

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

Konfigurieren der bedingten Protokollierung in Nginx

In einigen Fällen möchten wir möglicherweise, dass Nginx eine bedingte Protokollierung von Nachrichten durchführt. Nicht jede Nachricht muss von Nginx protokolliert werden, daher können wir unbedeutende oder weniger wichtige Protokolleinträge aus unseren Zugriffsprotokollen für bestimmte Instanzen ignorieren.

Wir können das Modul ngx_http_map_module verwenden, das Variablen erstellt, deren Werte von Werten anderer Variablen abhängen. Die Parameter innerhalb eines Map-Blocks (der nur im http-Inhalt vorhanden sein sollte) geben eine Zuordnung zwischen Quell- und Ergebniswerten an.

Bei dieser Art von Einstellung wird eine Anfrage nicht protokolliert, wenn die Bedingung „0“ oder eine leere Zeichenfolge ergibt. In diesem Beispiel sind Anfragen mit den HTTP-Statuscodes 2xx und 3xx ausgeschlossen.

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

Hier ist ein weiteres nützliches Beispiel für das Debuggen einer Webanwendung in einer Entwicklungsphase. Dadurch werden alle Meldungen ignoriert und nur Debug-Informationen protokolliert.

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

Weitere Informationen, einschließlich der Protokollierung im Syslog, finden Sie hier.

Das ist alles für jetzt! In dieser Anleitung haben wir erklärt, wie man ein benutzerdefiniertes Protokollierungsformat für Zugriffs- und Fehlerprotokolle in Nginx konfiguriert. Verwenden Sie das Feedback-Formular unten, um Fragen zu stellen oder Ihre Gedanken zu diesem Artikel mitzuteilen.