Überschreiben der Anweisung nginx access_log - doppelte Protokolleinträge

16

Ich verwende das Standard-Nginx-Paket auf dem Ubuntu 14.04-Server. Es wird /etc/nginx/nginx.confals Hauptkonfiguration verwendet und enthält dann die Konfigurationen von /etc/nginx/conf.d/*.confund /etc/nginx/sites-enabled/*.

Die Standardkonfiguration von nginx enthält diese Anweisung für die Protokollierung im Zugriffsprotokoll

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

Ich möchte den X-Forwarded-For-Header hinzufügen, also mache ich das im conf.dOrdner:

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

Das Problem, das ich habe, ist, dass ich dann zwei Datensätze in meiner Datei access.log erhalte - einen mit der Header-Information und einen anderen ohne.

Ich weiß, dass ich die nginx.confDatei selbst überschreiben kann, aber ich würde sie nach Möglichkeit lieber vermeiden. Ich möchte auch weiterhin dieselbe Protokolldatei verwenden ( access.log).

Gibt es eine Möglichkeit, nginx anzuweisen, die vorherige Anweisung zu überschreiben und einfach das Protokollformat zu ändern, ohne die Hauptdatei zu ändern nginx.conf?

Yoav Aner
quelle
Nee. Entfernen Sie es einfach aus nginx.conf
Alexey Ten
1
Ich habe ein Ticket dafür geöffnet. trac.nginx.org/nginx/ticket/1084
cweiske

Antworten:

4

Die Antwort auf Ihre Frage lautet NEIN. Sie können ein log_format auf keiner Ebene in nginx überschreiben, und Sie können access_log nicht überschreiben, wenn Sie sich auf derselben Ebene befinden, außer wenn Sie es ausschalten. Sie können jedoch das Gewünschte erreichen, ohne die Datei nginx.conf zu ändern, müssen dies jedoch auf Serverebene {} tun.

Das Problem hierbei ist, dass sich das Include von conf.d / * im http {} befindet, genau dort, wo sich die Direktive access_log befindet. Was Sie tun können, ohne nginx.conf zu berühren, ist, den verwendeten Server {} zu ändern (wenn Sie keinen eingerichtet haben, verwenden Sie den Standardserver unter / etc / nginx / sites-enabled / default). Um dasselbe zu erreichen, ohne die Datei nginx.conf zu ändern, sollten Sie Ihre Datei im Ordner conf.d folgendermaßen ändern: 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 off;

Und dann in deinen Server {} legen: access_log /var/log/nginx/access.log main;

Das sollte dir zu Beginn das bringen, was du wolltest.

Tapferkeit
quelle
Danke, das funktioniert super. Außer dass es normalerweise bereits ein mainlog_format gibt, so dass Sie einen anderen Namen wählen müssen.
Kutzi