如何在AWS中查看Docker容器内/var/log目录下的日志文件?
解决AWS ECS查看supervisord子进程日志的问题
问题根源
AWS ECS默认通过CloudWatch Logs收集的是容器主进程(此处为supervisord)的标准输出/错误流,但你当前的supervisord配置是把react-app、node-server、nginx的日志写到了容器内的/var/log/文件中,没有转发到容器的stdout/stderr,所以ECS的Logs页面只能看到Docker相关日志,看不到这些应用的日志内容。
解决方案
方法1:修改supervisord配置,直接输出到容器标准流(推荐)
把每个program的日志输出直接指向容器的/dev/stdout和/dev/stderr,让ECS能直接收集这些流。修改你的supervisord.conf如下:
[supervisord] nodaemon=true [program:nginx] command=nginx -g 'daemon off;' autostart=true autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 # 禁用日志滚动,持续输出到标准流 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 [program:node-server] command=node server.js autostart=true autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 [program:react-app] command=npm start directory=/app autostart=true autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0
方法2:保留文件日志,通过tail转发到标准流(备选)
如果需要保留容器内的日志文件,可以新增一个supervisord进程,用tail命令实时读取日志文件并输出到标准流:
在supervisord.conf末尾添加:
[program:log-forwarder] command=tail -f /var/log/nginx.log /var/log/nginx_err.log /var/log/node_server.log /var/log/node_server_err.log /var/log/react_app.log /var/log/react_app_err.log autostart=true autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0
这种方式会把所有日志混在一起输出,不如方法1的日志区分清晰,仅作为备选方案。
生效步骤
- 保存修改后的
supervisord.conf - 重新构建Docker镜像并推送到ECR(或你使用的镜像仓库)
- 更新ECS服务,使用新的镜像版本
- 等待服务更新完成后,再次访问ECS服务的Logs页面,就能看到各个应用的日志内容了
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

