有没有一种方法可以使主进程日志记录到STDOUT STDERR而不是文件中?
看来您只能将文件路径传递给access_log指令:
access_log /var/log/nginx/access.log
对于error_log也是如此:
error_log /var/log/nginx/error.log
我知道这可能不是nginx的功能,例如,我会对使用tail的简洁解决方案感兴趣。尽管它最好来自主进程,因为我在前台运行nginx。
有没有一种方法可以使主进程日志记录到STDOUT STDERR而不是文件中?
看来您只能将文件路径传递给access_log指令:
access_log /var/log/nginx/access.log
对于error_log也是如此:
error_log /var/log/nginx/error.log
我知道这可能不是nginx的功能,例如,我会对使用tail的简洁解决方案感兴趣。尽管它最好来自主进程,因为我在前台运行nginx。
Answers:
编辑:好像nginx现在支持Anon的答案中error_log stderr;
提到的。
您可以将日志发送到/dev/stdout
。在nginx.conf
:
daemon off;
error_log /dev/stdout info;
http {
access_log /dev/stdout;
...
}
编辑:如果使用运行某些docker容器,可能需要运行ln -sf / proc / self / fd / dev /,然后使用/dev/fd/1
或/dev/fd/2
ENXIO
当stdout向套接字而不是文件打开时,我看到此操作失败。有一个上游内核票证表明这是故意并有意为之:bugzilla.kernel.org/show_bug.cgi?id=1360-因此,尽管在某些情况下此答案足够了,但仍不能完全涵盖可能的范围。失败。
stderr
根据文档,nginx应该输出到该文件)
如果问题与docker相关...正式的nginx docker镜像通过建立指向stdout / stderr的软链接来做到这一点
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
FROM nginx:alpine RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log CMD ["nginx-debug", "-g", "daemon off;"]
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时,请注意,挂载在日志目录上的卷无法达到在Dockerfile中的日志文件和stdout / stderr之间创建软链接的目的,如@Boeboe的答案中所述。
在那种情况下,您可以在入口点创建软链接(在安装卷之后执行),也可以根本不使用卷(例如,当中央日志系统已经收集日志时)。
在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