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


136

有没有一种方法可以使主进程日志记录到STDOUT STDERR而不是文件中?

看来您只能将文件路径传递给access_log指令:

access_log  /var/log/nginx/access.log

对于error_log也是如此:

error_log /var/log/nginx/error.log

我知道这可能不是nginx的功能,例如,我会对使用tail的简洁解决方案感兴趣。尽管它最好来自主进程,因为我在前台运行nginx。


14
在Docker容器中使用Nginx吗?查看此答案
czerasz

接受的答案(Patrick)适用于Nginx官方Docker映像(hub.docker.com/_/nginx)。
Farshid T

Answers:


196

编辑:好像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


2
当我尝试执行此操作时,出现以下错误:2014/07/29 10:19:09 [emerg] 13742#0:open()“ / dev / stdout”失败(13:权限被拒绝)
Jon Tirsen

1
乔恩,您在什么系统上?在我的系统上,/ dev / stdout是/ dev / fd / 1的世界可读符号链接,该链接由我的用户拥有并可以读写。
帕特里克

1
ENXIO当stdout向套接字而不是文件打开时,我看到此操作失败。有一个上游内核票证表明这是故意并有意为之:bugzilla.kernel.org/show_bug.cgi?id=1360-因此,尽管在某些情况下此答案足够了,但仍不能完全涵盖可能的范围。失败。
2014年

1
在此上浪费了几个小时,没有任何成功。试图更改所有内容(守护程序模式,用户,nginx版本等)。只是对我不起作用。“”“ open()” / dev / stderr“失败(6:无此类设备或地址)”“”(与stdout相同的问题,但stderr根据文档,nginx应该输出到该文件)
Ivan Kleshnin

1
如果您的进程未在容器中以root用户身份运行,则在docker内部,您可能会被拒绝权限。在下一版本中将对此进行修复。
Dobes Vandermeer

54

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


5
这个答案大部分是正确的,但不幸的是对于高山图像(请参阅github.com/nginxinc/docker-nginx/blob/master/stable/alpine/…),仅对于像jessie这样的其他人使用此语句。如果您是高山用户,只需使用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;"]
jonashackt

1
帕特里克(Patrick)的答案适用于正式的nginx图像(hub.docker.com/_/nginx),包括debian(最新版本)和高山基地。
Farshid T

您的REF链接似乎已失效。
撒尿

@jonashackt我使用了高山图像,发现它也记录到了stdout
Qiulang

单击一个版本(hub.docker.com/_/nginx)以查看带有上述行(第100行之前的某处)的docker文件。
qräbnö

24
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,这将破坏您的设置。


5

在Docker容器中运行Nginx时,请注意,挂载在日志目录上的卷无法达到在Dockerfile中的日志文件和stdout / stderr之间创建软链接的目的,如@Boeboe的答案中所述

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


3

在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

1

出于调试目的:

/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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.