Nginx 如何把 access_log 和 error_log 输出到 stdout/stderr?

容器化 Nginx 把日志输出到标准流:access_log /dev/stdout 与 error_log /dev/stderr;官方镜像用软链接 /var/log/nginx/access.log → /dev/stdout 实现。本文给出两种写法与注意事项。

最佳实践
Nginx 如何把 access_log 和 error_log 输出到 stdout/stderr?封面

容器场景的标配写法:access_log /dev/stdout;error_log /dev/stderr;——日志进标准流后由容器运行时统一收集(docker logs、K8s 日志),不再写容器内文件。

写法一:直接指向设备文件

http {
    access_log /dev/stdout main;
    error_log  /dev/stderr warn;
}

写法二:软链接(官方镜像做法)

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

配置保持写文件路径,实际落到标准流——兼容那些改不了日志路径的场景。

注意事项

  • 主进程与 worker 都要覆盖:error_log 指令放在 main(顶层)上下文确保启动错误也可见;
  • daemon off:容器里 Nginx 以前台运行(CMD ["nginx", "-g", "daemon off;"]),与标准流日志配套;
  • 别再配 logrotate——容器日志轮转由 Docker/K8s 的日志驱动负责。

观测云对照

观测云 DataKit 采集容器标准流日志,stdout/stderr 自动打标区分,Nginx 日志可用内置 Pipeline 模板一键结构化。

常见问题(FAQ)

Q:/dev/stdout 在某些系统报权限错误? 用 /proc/self/fd/1 替代,或确认 worker 进程用户对伪终端的写权限。

Q:想同时写文件和 stdout? 配两行 access_log 指令分别指向。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台