是否有一种方法可以将主进程日志保存到STDOUT STDERR而不是文件中?

似乎你只能将一个文件路径传递给access_log指令:

access_log  /var/log/nginx/access.log

error_log也一样:

error_log /var/log/nginx/error.log

我知道这可能不是nginx的一个特性,我对一个使用tail的简洁解决方案很感兴趣。它最好来自主进程,因为我在前台运行nginx。


当前回答

在PHP-FPM的docker image中,我看到过这样的方法:

# 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

其他回答

如果问题与docker有关…官方nginx docker镜像通过创建指向stdout/stderr的软链接来做到这一点

运行-sf /dev/stdout /var/ nginx/access.log &

裁判:https://microbadger.com/images/nginx

根据官方的docker Nginx图像,这已经到位了

要了解更多信息,您可以查看为1-alpine版本编写的Dockerfile,其中分别将访问日志和错误日志软链接到stdout和stderr。其他docker标签也有。

裁判:https://github.com/nginxinc/docker-nginx/blob/1.23.1/stable/alpine/Dockerfile # L118-L119

在PHP-FPM的docker image中,我看到过这样的方法:

# 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
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 如果你要使用system -nspawn,这会破坏你的设置。

当在Docker容器中运行Nginx时,要注意挂载在日志目录上的卷不能在日志文件和Dockerfile中的stdout/stderr之间创建软链接,就像@Boeboe的回答中描述的那样。

在这种情况下,您可以在入口点创建软链接(在卷挂载后执行),或者根本不使用卷(例如,当日志已经由中央日志记录系统收集时)。