Avere nginx access_log e error_log accedere a STDOUT e STDERR del processo principale


137

C'è un modo per fare in modo che il processo principale registri su STDOUT STDERR anziché su un file?

Sembra che puoi solo passare un percorso file alla direttiva access_log:

access_log  /var/log/nginx/access.log

E lo stesso vale per error_log:

error_log /var/log/nginx/error.log

Capisco che questa semplicemente non può essere una caratteristica di nginx, sarei interessato a una soluzione concisa che usa la coda, per esempio. È preferibile però che provenga dal processo principale, perché sto eseguendo nginx in primo piano.


14
Usi Nginx all'interno di un contenitore Docker? Dai un'occhiata a questa risposta .
Czerasz,

La risposta accettata (Patrick's) funziona per le immagini ufficiali di Nginx Docker (hub.docker.com/_/nginx).
Farshid T,

Risposte:


198

Modifica: sembra che nginx ora supporti error_log stderr;come menzionato nella risposta di Anon .

È possibile inviare i registri a /dev/stdout. In nginx.conf:

daemon off;
error_log /dev/stdout info;

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

modifica: potrebbe essere necessario eseguire ln -sf / proc / self / fd / dev / se si utilizza l'esecuzione di determinati contenitori docker, quindi utilizzare /dev/fd/1o/dev/fd/2


2
Quando provo a fare questo ottengo il seguente errore: 29/07/2014 10:19:09 [emerg] 13742 # 0: open () "/ dev / stdout" non riuscito (13: autorizzazione negata)
Jon Tirsen

1
Jon, su che sistema sei? Sul mio sistema, / dev / stdout è un link simbolico leggibile in tutto il mondo a / dev / fd / 1 che è di proprietà e letto + scrivibile dal mio utente.
Patrick,

1
Lo vedo fallire ENXIOquando stdout è aperto a un socket anziché a un file. C'è un ticket del kernel upstream che indica che questo è intenzionale e intenzionale: bugzilla.kernel.org/show_bug.cgi?id=1360 - quindi, sebbene questa risposta sia sufficiente in alcuni casi, non copre completamente la gamma di possibili fallimenti.
Charles Duffy,

1
Ci ho perso qualche ora senza successo. Ho provato a cambiare tutto (modalità demone, utenti, versioni nginx ecc.). Semplicemente non funziona per me. "" "open ()" / dev / stderr "non riuscito (6: nessun dispositivo o indirizzo del genere)" "" (stessi problemi con stdout, ma nginx dovrebbe essere pubblicato stderrsecondo i documenti)
Ivan Kleshnin

1
All'interno di una finestra mobile potrebbe essere negata l'autorizzazione se il processo non viene eseguito come root nel contenitore. C'è una soluzione per questo nella prossima versione.
Dobes Vandermeer,

54

Se la domanda è relativa alla finestra mobile ... le immagini della finestra mobile ufficiale nginx lo fanno creando dei softlink verso stdout / stderr

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

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


5
Questa risposta è per lo più corretta, ma purtroppo non per le immagini alpine (vedi github.com/nginxinc/docker-nginx/blob/master/stable/alpine/… ), solo per gli altri come Jessie usano questa affermazione. Se sei un utente alpino, crea il tuo Dockerfile con 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
La risposta di Patrick funziona con immagini ufficiali di nginx ( hub.docker.com/_/nginx ), entrambe le basi debian (ultima) e alpina.
Farshid T,

Il tuo link REF sembra essere morto.
Peedee,

@jonashackt Ho usato immagini alpine e l'ho trovato anche registrato su stdout
Qiulang

Fare clic su una versione ( hub.docker.com/_/nginx ) per visualizzare il file docker con la riga sopra menzionata (da qualche parte prima della riga 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

Non usare: /dev/stderr questo interromperà la configurazione se intendi utilizzare systemd-nspawn.


5

Quando si esegue Nginx in un contenitore Docker, tenere presente che un volume montato sulla directory di registro vanifica lo scopo di creare un collegamento software tra i file di registro e stdout / stderr nel file Docker, come descritto nella risposta di @Boeboe .

In tal caso, è possibile creare il softlink nel punto di accesso (eseguito dopo che i volumi sono stati montati) o non utilizzare affatto un volume (ad esempio quando i registri sono già raccolti da un sistema di registrazione centrale).


3

Nell'immagine docker di PHP-FPM, ho visto questo approccio:

# 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

1

A scopo di debug:

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

Per uno scopo classico

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

richiedere

Sotto la parentesi del server sul file di configurazione

access_log /dev/stdout;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.