有nginx access_log和error_log日志的STDOUT和STDERR的主进程

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

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

access_log  /var/log/nginx/access.log

error_log也一样:

error_log /var/log/nginx/error.log

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

208638 次浏览

编辑:似乎nginx现在支持error_log stderr;,正如在立刻的回答中提到的。

您可以将日志发送到/dev/stdout。在nginx.conf:

daemon off;
error_log /dev/stdout info;


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

edit:如果使用运行某些docker容器,可能需要运行Ln -sf /proc/self/fd /dev/,然后使用/dev/fd/1/dev/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 如果你要使用systemd-nspawn,这将破坏你的设置

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

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

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

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

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

在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

出于调试目的:

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

为了一个经典的目的

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

需要

在配置文件的服务器括号下

access_log /dev/stdout;

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

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

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