web-dev-qa-db-fra.com

Demander à nginx access_log et error_log de se connecter à STDOUT et à STDERR du processus maître

Existe-t-il un moyen de consigner le journal de processus maître dans STDOUT STDERR plutôt que dans un fichier? 

Il semble que vous ne pouvez passer qu'un chemin de fichier à la directive access_log:

access_log  /var/log/nginx/access.log

Et il en va de même pour error_log:

error_log /var/log/nginx/error.log

Je comprends que cela ne soit tout simplement pas une fonctionnalité de nginx, je serais intéressé par une solution concise qui utilise la queue, par exemple. Il est préférable que cela vienne du processus maître, car j’exécute nginx au premier plan. 

96
quinn

Si la question est liée au docker ... les images officielles du docker nginx le font en faisant des liens symboliques vers

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

36
Boeboe
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

N'utilisez pas: /dev/stderr Cela cassera votre configuration si vous voulez utiliser systemd-nspawn.

18
Anon

Lors de l'exécution de Nginx dans un conteneur Docker, sachez qu'un volume monté sur le répertoire de journalisation empêche la création d'un lien symbolique entre les fichiers journaux et stdout/stderr dans votre fichier Docker, comme décrit dans @Boeboe's answer

Dans ce cas, vous pouvez créer le lien symbolique dans votre point d'entrée (exécuté après le montage des volumes) ou ne pas utiliser de volume du tout (par exemple, lorsque les journaux sont déjà collectés par un système de journalisation central). 

3
VME

Dans l'image de docker de PHP-FPM, je vois une telle approche:

# 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
0
Oleg Neumyvakin