Имейте nginx access_log и журнал ошибок в STDOUT и STDERR основного процесса

Есть ли способ, чтобы журнал основного процесса в STDOUT STDERR вместо файла?

Кажется, что вы можете передать путь файла только к директиве access_log:

access_log  /var/log/nginx/access.log

И то же самое касается error_log:

error_log /var/log/nginx/error.log

Я понимаю, что это просто не может быть особенностью nginx, я бы интересовался кратким решением, которое использует хвост, например. Желательно, однако, что это происходит из мастер-процесса, хотя я запускаю nginx на переднем плане.

Ответ 1

Изменить: кажется, что nginx теперь поддерживает error_log stderr;, как указано в Anon answer.

Вы можете отправить журналы на /dev/stdout. В nginx.conf:

daemon off;
error_log /dev/stdout info;

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

edit: Может потребоваться запустить ln -sf/proc/self/fd/dev/, если вы используете определенные контейнеры докеров, затем используйте /dev/fd/1 или /dev/fd/2

Ответ 2

Если вопрос связан с докером... официальные изображения докеры nginx делают это, делая softlinks в направлении stdout/stderr

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

Ответ 3

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

Не используйте: /dev/stderr Это нарушит ваши настройки, если вы собираетесь использовать systemd-nspawn.

Ответ 4

При запуске Nginx в контейнере Docker имейте в виду, что том, смонтированный над журнальным файлом, поражает цель создания softlink между файлами журнала и stdout/stderr в вашем файле Docker, как описано в @Ответ Boeboe.

В этом случае вы можете либо создать программную ссылку в своей точке входа (выполняемую после установки томов), либо вообще не использовать тома (например, когда журналы уже собраны центральной системой ведения журнала).

Ответ 5

В образе докера PHP-FPM я вижу такой подход:

# 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