有没有办法让主进程记录到STDOUT STDERR而不是文件?
您似乎只能将文件路径传递给access_log指令:
access_log /var/log/nginx/access.log
对于error_log也是如此:
error_log /var/log/nginx/error.log
据我所知,这可能不是nginx的一个特性,例如,我对使用tail的简洁解决方案感兴趣。虽然它来自主进程,但最好是因为我在前台运行nginx。
答案 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
答案 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;