将nginx access_log和error_log日志记录到主进程的STDOUT和STDERR

时间:2014-03-20 17:55:59

标签: nginx

有没有办法让主进程记录到STDOUT STDERR而不是文件?

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

access_log  /var/log/nginx/access.log

对于error_log也是如此:

error_log /var/log/nginx/error.log

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

5 个答案:

答案 0 :(得分:153)

编辑:似乎nginx现在支持Anon's answer中提到的error_log stderr;

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

daemon off;
error_log /dev/stdout info;

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

编辑:如果使用某些泊坞广告容器,可能需要运行ln -sf /proc/self/fd /dev/,然后使用/dev/fd/1/dev/fd/2

答案 1 :(得分:40)

如果问题与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

答案 2 :(得分:3)

在Docker容器中运行Nginx时,请注意安装在日志目录上的卷会破坏在Dockerfile中日志文件和stdout / stderr之间创建软链接的目的,如@Boeboe 's answer中所述。

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

答案 3 :(得分:2)

在PHP-FPM的docker镜像中,我看到了这样的方法:

# 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

答案 4 :(得分: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;