Miej nginx access_log i error_log log do STDOUT i STDERR procesu głównego

148

Czy istnieje sposób, aby główny dziennik procesu do STDOUT STDERR zamiast do pliku?

Wygląda na to, że możesz przekazać ścieżkę pliku tylko do dyrektywy access_log:

access_log  /var/log/nginx/access.log

To samo dotyczy error_log:

error_log /var/log/nginx/error.log

Rozumiem, że może to po prostu nie być cechą nginx, byłbym zainteresowany na przykład zwięzłym rozwiązaniem wykorzystującym tail. Zaleca się jednak, aby pochodziła z procesu głównego, ponieważ na pierwszym planie uruchamiam nginx.

quinn
źródło
14
Używasz Nginx w kontenerze Docker? Sprawdź tę odpowiedź .
czerasz
Zaakceptowana odpowiedź (Patricka) działa w przypadku oficjalnych obrazów Nginx Docker (hub.docker.com/_/nginx).
Farshid T

Odpowiedzi:

211

Edycja: wygląda na to, że nginx obsługuje teraz, error_log stderr;jak wspomniano w odpowiedzi Anona .

Możesz wysłać dzienniki do /dev/stdout. W nginx.conf:

daemon off;
error_log /dev/stdout info;

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

edycja: Może być konieczne uruchomienie ln -sf / proc / self / fd / dev / jeśli używasz niektórych kontenerów docker, a następnie użyj /dev/fd/1lub/dev/fd/2

Patrick
źródło
2
Kiedy próbuję to zrobić, pojawia się następujący błąd: 2014/07/29 10:19:09 [emerg] 13742 # 0: open () "/ dev / stdout" nie powiodło się (13: Odmowa uprawnień)
Jon Tirsen
1
Jon, na jakim systemie jesteś? W moim systemie / dev / stdout jest dowiązaniem symbolicznym do odczytu na całym świecie do / dev / fd / 1, którego właścicielem jest mój użytkownik, który może go odczytywać i zapisywać.
Patrick,
1
Widzę, że to się nie powiedzie, ENXIOgdy standardowe wyjście jest otwarte dla gniazda, a nie pliku. Istnieje bilet jądra źródłowego wskazujący, że jest to zamierzone i zamierzone: bugzilla.kernel.org/show_bug.cgi?id=1360 - tak więc, chociaż ta odpowiedź jest wystarczająca w niektórych przypadkach, nie obejmuje w pełni awarie.
Charles Duffy
1
Straciłem na tym kilka godzin bez żadnego sukcesu. Próbowałem zmienić wszystko (tryby demona, użytkowników, wersje nginx itp.). U mnie to po prostu nie działa. Błąd "" "open ()" / dev / stderr "nie powiódł się (6: Brak takiego urządzenia lub adresu)" "" (te same problemy ze standardowym wyjściem, ale nginx powinien stderr
wypisać
1
Wewnątrz dockera możesz otrzymać odmowę uprawnień, jeśli twój proces nie działa jako root w kontenerze. W następnej wersji nadchodzi poprawka.
Dobes Vandermeer
58

Jeśli pytanie dotyczy Dockera ... oficjalne obrazy Dockera Nginx robią to, tworząc miękkie linki do stdout / stderr

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

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

Boeboe
źródło
6
Ta odpowiedź jest w większości poprawna, ale niestety nie dla obrazów alpejskich (patrz github.com/nginxinc/docker-nginx/blob/master/stable/alpine/… ), tylko dla innych, takich jak jessie , używają tego stwierdzenia. Jeśli jesteś użytkownikiem alpejskim, po prostu utwórz swój własny plik Dockerfile za pomocą 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
Odpowiedź Patricka działa dla oficjalnych obrazów nginx ( hub.docker.com/_/nginx ), zarówno dla baz debian (najnowsze), jak i alpine.
Farshid T
Twój link REF wygląda na martwy.
sikanie
@jonashackt Użyłem obrazów alpejskich i znalazłem je również zalogowane na stdout
Qiulang
Kliknij wersję ( hub.docker.com/_/nginx ), aby zobaczyć plik Dockera z wyżej wymienioną linią (gdzieś przed linią 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

Nie używaj: /dev/stderr spowoduje to uszkodzenie konfiguracji, jeśli zamierzasz używać systemd-nspawn.

Zaraz
źródło
5

Podczas uruchamiania Nginx w kontenerze Docker należy pamiętać, że wolumin zamontowany nad katalogiem dziennika jest sprzeczny z celem tworzenia miękkiego łącza między plikami dziennika a stdout / stderr w pliku Dockerfile, jak opisano w odpowiedzi @Boeboe .

W takim przypadku możesz albo utworzyć łącze programowe w punkcie wejścia (wykonywane po zamontowaniu woluminów), albo w ogóle nie używać woluminu (np. Gdy logi są już zebrane przez centralny system logowania).

żywiołowy
źródło
3

W obrazie dockera PHP-FPM widziałem takie podejście:

# 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
źródło
1

W celu debugowania:

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

Do klasycznego celu

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

Wymagać

Pod nawiasem serwera w pliku konfiguracyjnym

access_log /dev/stdout;
intika
źródło