Nginx 如何把 access_log 和 error_log 输出到 stdout/stderr?
容器化 Nginx 把日志输出到标准流:access_log /dev/stdout 与 error_log /dev/stderr;官方镜像用软链接 /var/log/nginx/access.log → /dev/stdout 实现。本文给出两种写法与注意事项。
容器场景的标配写法: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 指令分别指向。