AWS ECS Fargate使用Firelens边车推送应用容器日志到Cloudwatch问题
问题根源
ECS Fargate中不同容器的文件系统默认相互隔离,Fluent Bit边车运行在独立的容器命名空间下,默认无法直接访问应用容器内的文件系统路径,你需要通过共享卷挂载的方式,让两个容器共享日志存储目录。
具体修改步骤
- 新增共享卷配置
在任务定义的volumes数组中添加一个共享卷,用于存放应用日志,Fargate会自动为该卷分配临时存储空间:
"volumes": [ { "name": "app-logs", "host": {} } ]
- 为应用容器配置挂载
修改my-app容器的mountPoints字段,将应用的日志目录挂载到上述共享卷:
"mountPoints": [ { "sourceVolume": "app-logs", "containerPath": "/opt/apache-tomcat-8.5.72/my-app/logs", "readOnly": false } ]
- 为Fluent Bit边车配置挂载
修改log_router容器的mountPoints字段,将同一个共享卷挂载到边车的对应路径(和你当前配置里的exec、后续tail的路径保持一致即可):
"mountPoints": [ { "sourceVolume": "app-logs", "containerPath": "/opt/apache-tomcat-8.5.72/my-app/logs", "readOnly": true } ]
额外注意事项
- 你当前的配置存在两套CloudWatch输出规则:一套是自定义Fluent Bit配置中的
[OUTPUT]段,另一套是应用容器logConfiguration中配置的awsfirelens日志驱动。前者用于收集你通过tail/exec读取的日志文件内容,后者用于收集应用容器输出到stdout/stderr的日志,二者独立运行不会冲突,按需保留即可。 - 后续切换为
tail输入时,建议添加Docker_Mode On配置,适配Java应用常见的多行异常栈日志。 - 你已经将边车的运行用户设为root(
"user": "0"),无需额外调整日志文件读取权限。
内容的提问来源于stack exchange,提问作者nirajj
相关产品推荐
相关产品推荐

