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.