AWS Elastic Beanstalk Docker自定义日志logger.log无法同步至CloudWatch求助
排查Elastic Beanstalk Docker环境自定义日志无法同步到CloudWatch的问题
咱们一步步来拆解这个问题,先从配置细节和调试手段入手:
一、先检查.ebextensions配置的格式问题
YAML格式对缩进和语法要求很严格,你的01_cloudwatch.config可能存在格式疏漏,比如content块内的ini配置、键值对的空格等。正确的配置格式应该是这样的:
files: /etc/awslogs/config/my_app_log.conf: content: | [/var/log/eb-docker/containers/eb-current-app/logger.log] log_group_name = /aws/elasticbeanstalk/appname/var/log/eb-docker/containers/eb-current-app/logger.log log_stream_name = {instance_id} file = /var/log/eb-docker/containers/eb-current-app/logger.log group: root mode: "000600" owner: root
注意:
- ini配置里的键值对最好加上空格(比如
log_group_name = xxx),避免解析异常 - 确认整个YAML的缩进层级一致,不要出现混合缩进的情况
二、关键调试步骤
1. 查看awslogs自身的运行日志
awslogs服务会把采集失败的原因(比如路径不存在、权限不足、配置错误)记录在本地日志里,执行这条命令查看实时日志:
tail -f /var/log/awslogs.log
如果看到类似No such file or directory或Permission denied的报错,就能直接定位问题。
2. 验证自定义日志配置的合法性
用awslogs自带的工具测试你的配置文件是否有效:
awslogs-agent-cli -c /etc/awslogs/config/my_app_log.conf -t
这个命令会检查配置语法、日志文件路径是否存在、权限是否允许读取,直接给出验证结果。
3. 确认日志文件的权限与内容
虽然你说文件存在,但还是要确认:
- 执行
ls -l /var/log/eb-docker/containers/eb-current-app/logger.log,检查文件的所有者和权限,确保root用户(awslogs服务默认以root运行)有读取权限 - 确认文件里有实际内容,空日志文件可能不会被立即同步到CloudWatch
4. 检查容器内的日志输出路径
你的Dockerrun.aws.json里配置了Logging: "/path/to/logs",这是容器内的路径,EB会把这个路径映射到主机的/var/log/eb-docker/containers/eb-current-app/下。需要确认:
- 容器内的
/path/to/logs/logger.log确实在输出日志 - 可以通过
docker exec -it <你的容器ID> cat /path/to/logs/logger.log验证容器内的日志内容
5. 确认awslogs服务状态
执行以下命令确保服务正常运行,并且配置修改后已经重启:
sudo service awslogs status sudo service awslogs restart
三、其他可能的遗漏点
- 检查CloudWatch Logs控制台,确认是否已经创建了对应的日志组(有时候新日志组会延迟几分钟显示)
- 替换
log_group_name里的appname为你实际的Elastic Beanstalk环境名称,虽然不影响采集,但能和默认日志组的命名规则保持一致,方便管理
内容的提问来源于stack exchange,提问作者Lyubomir
相关产品推荐
相关产品推荐

