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

qui*_*inn 116 nginx

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

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

access_log  /var/log/nginx/access.log
Run Code Online (Sandbox Code Playgroud)

error_log也是如此:

error_log /var/log/nginx/error.log
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*ick 171

编辑:似乎nginx现在支持Anon的回答中error_log stderr;提到.

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

daemon off;
error_log /dev/stdout info;

http {
  access_log /dev/stdout;
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 当我尝试这样做时,我收到以下错误:2014/07/29 10:19:09 [emerg] 13742#0:open()"/ dev/stdout"失败(13:权限被拒绝) (2认同)
  • 当标准输出打开套接字而不是文件时,我看到“ENXIO”失败。有一个上游内核票证表明这是故意的和有意的:https://bugzilla.kernel.org/show_bug.cgi?id=1360 - 因此,虽然这个答案在某些情况下是足够的,但它并没有完全涵盖可能发生故障的范围。 (2认同)
  • 为此浪费了几个小时,但没有成功。尝试改变一切(守护进程模式、用户、nginx 版本等)。它只是对我不起作用。“”“open()”/dev/stderr“失败(6:没有这样的设备或地址)”“”(与stdout相同的问题,但根据文档,nginx应该输出到`stderr`) (2认同)
  • 不要使用“/dev/sdtout”或“/dev/stderr”。使用“stdout”或“stderr”。 (2认同)

Boe*_*boe 45

如果问题是与docker相关的...官方的nginx docker图像是通过向stdout/stderr建立软链接来实现的

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

REF:https://microbadger.com/images/nginx

  • 这个答案大多是正确的,但遗憾的是不是*alpine*图片(参见https://github.com/nginxinc/docker-nginx/blob/master/stable/alpine/Dockerfile),仅适用于像[jessie]这样的其他人(https://github.com/nginxinc/docker-nginx/blob/8921999083def7ba43a06fabd5f80e4406651353/mainline/jessie/Dockerfile#L21-L23)请使用此语句.如果你是一个高山用户,只需使用`FROM nginx:alpine RUN ln -sf/dev/stdout /var/log/nginx/access.log\&& ln -sf/dev/stderr/var/log创建自己的Dockerfile /nginx/error.log CMD ["nginx-debug"," - g","daemon off;"]` (5认同)
  • 帕特里克的回答适用于官方 nginx 图像(https://hub.docker.com/_/nginx/),包括 debian(最新)和 alpine 基础。 (2认同)
  • @jonashackt 新版本的 alpine 现在可以工作 https://github.com/nginxinc/docker-nginx/blob/master/stable/alpine/Dockerfile#L109 (2认同)

小智 21

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
Run Code Online (Sandbox Code Playgroud)

http://nginx.org/en/docs/ngx_core_module.html#error_log

不要使用:/dev/stderr 如果您要使用systemd-nspawn,这将破坏您的设置.

  • 这适用于error_log但不适用于access_log. (10认同)

int*_*ika 12

出于调试目的:

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout debug;"
Run Code Online (Sandbox Code Playgroud)

为了经典的目的

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout info;"
Run Code Online (Sandbox Code Playgroud)

要求

在配置文件的服务器支架下

access_log /dev/stdout;
Run Code Online (Sandbox Code Playgroud)


moh*_*ati 6

基于官方 docker Nginx 镜像,这已经就位

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

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


veu*_*ent 5

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

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


Ole*_*kin 5

在 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
Run Code Online (Sandbox Code Playgroud)