Lassen Sie nginx access_log und error_log auf STDOUT und STDERR des Masterprozesses protokollieren

135

Gibt es eine Möglichkeit, das Master-Prozessprotokoll in STDOUT STDERR anstatt in einer Datei zu speichern?

Es scheint, dass Sie nur einen Dateipfad an die Direktive access_log übergeben können:

access_log  /var/log/nginx/access.log

Gleiches gilt für error_log:

error_log /var/log/nginx/error.log

Ich verstehe, dass dies möglicherweise kein Merkmal von Nginx ist. Ich wäre an einer prägnanten Lösung interessiert, die beispielsweise Tail verwendet. Es ist jedoch vorzuziehen, dass es aus dem Master-Prozess stammt, da ich Nginx im Vordergrund ausführe.

Quinn
quelle
14
Verwenden Sie Nginx in einem Docker-Container? Überprüfen Sie diese Antwort .
Czerasz
Die akzeptierte Antwort (Patrick's) funktioniert für offizielle Nginx Docker-Bilder (hub.docker.com/_/nginx).
Farshid T

Antworten:

195

Bearbeiten: Es scheint, dass Nginx jetzt unterstützt, error_log stderr;wie in Anons Antwort erwähnt .

Sie können die Protokolle an senden /dev/stdout. In nginx.conf:

daemon off;
error_log /dev/stdout info;

http {
  access_log /dev/stdout;
  ...
}

Bearbeiten: Möglicherweise muss ln -sf / proc / self / fd / dev / ausgeführt werden, wenn bestimmte Docker-Container ausgeführt werden. Verwenden Sie dann /dev/fd/1oder/dev/fd/2

Patrick
quelle
2
Wenn ich dies versuche, wird folgende Fehlermeldung angezeigt: 29.07.2014 10:19:09 [emerg] 13742 # 0: open () "/ dev / stdout" fehlgeschlagen (13: Berechtigung verweigert)
Jon Tirsen
1
Jon, auf welchem ​​System bist du? Auf meinem System ist / dev / stdout ein weltweit lesbarer Symlink zu / dev / fd / 1, der meinem Benutzer gehört und von ihm gelesen und beschrieben werden kann.
Patrick
1
Ich sehe, dass dies fehlschlägt, ENXIOwenn stdout für einen Socket und nicht für eine Datei geöffnet ist. Es gibt ein Upstream-Kernel-Ticket, das darauf hinweist, dass dies absichtlich und absichtlich ist: bugzilla.kernel.org/show_bug.cgi?id=1360 - obwohl diese Antwort in einigen Fällen ausreichend ist, deckt sie den möglichen Bereich nicht vollständig ab Ausfälle.
Charles Duffy
1
Ich habe ein paar Stunden ohne Erfolg verloren. Es wurde versucht, alles zu ändern (Daemon-Modi, Benutzer, Nginx-Versionen usw.). Bei mir funktioniert es einfach nicht. "" "open ()" / dev / stderr "fehlgeschlagen (6: Kein solches Gerät oder keine solche Adresse)" "(gleiche Probleme mit stdout, aber Nginx sollte stderrlaut Dokumentation ausgegeben werden)
Ivan Kleshnin
1
In einem Docker wird Ihnen möglicherweise die Berechtigung verweigert, wenn Ihr Prozess nicht als Root im Container ausgeführt wird. In der nächsten Version wird dies behoben.
Dobes Vandermeer
54

Wenn die Frage mit dem Docker zusammenhängt, tun dies die offiziellen Nginx-Docker-Bilder, indem sie Softlinks zu stdout / stderr erstellen

RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log

REF: https://microbadger.com/images/nginx

Boeboe
quelle
5
Diese Antwort ist größtenteils richtig, aber leider nicht für die alpinen Bilder (siehe github.com/nginxinc/docker-nginx/blob/master/stable/alpine/… ), nur für andere wie jessie . Wenn Sie ein alpiner Benutzer sind, erstellen Sie einfach Ihre eigene Docker-Datei mit FROM nginx:alpine RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log CMD ["nginx-debug", "-g", "daemon off;"]
jonashackt
1
Patricks Antwort funktioniert für offizielle Nginx- Bilder ( hub.docker.com/_/nginx ), sowohl für Debian- (neueste) als auch für alpine Basen.
Farshid T
Ihr REF-Link scheint tot zu sein.
Peedee
@ Jonashackt Ich habe alpine Bilder verwendet und festgestellt, dass sie auch bei stdout angemeldet sind
Qiulang
Klicken Sie auf eine Version ( hub.docker.com/_/nginx ), um die Docker-Datei mit der oben genannten Zeile anzuzeigen (irgendwo vor Zeile 100).
Qräbnö
24
Syntax: error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
Default:    
error_log logs/error.log error;
Context:    main, http, stream, server, location

http://nginx.org/en/docs/ngx_core_module.html#error_log

Nicht verwenden: /dev/stderr Dies bricht Ihr Setup, wenn Sie systemd-nspawn verwenden.

Anon
quelle
5

Beachten Sie beim Ausführen von Nginx in einem Docker-Container, dass ein über das Protokollverzeichnis gemountetes Volume den Zweck der Erstellung eines Softlinks zwischen den Protokolldateien und stdout / stderr in Ihrer Docker-Datei zunichte macht, wie in der Antwort von @Boeboe beschrieben .

In diesem Fall können Sie entweder den Softlink in Ihrem Einstiegspunkt erstellen (ausgeführt, nachdem Volumes bereitgestellt wurden) oder überhaupt kein Volume verwenden (z. B. wenn Protokolle bereits von einem zentralen Protokollierungssystem erfasst wurden).

veuncent
quelle
3

Im Docker-Image von PHP-FPM sehe ich einen solchen Ansatz:

# cat /usr/local/etc/php-fpm.d/docker.conf
[global]
error_log = /proc/self/fd/2

[www]
; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2
Oleg Neumyvakin
quelle
1

Für einen Debug-Zweck:

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout debug;"

Für einen klassischen Zweck

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout info;"

Benötigen

Unter der Server-Klammer in der Konfigurationsdatei

access_log /dev/stdout;
Intika
quelle