AWS Elastic Beanstalk 上的 Docker 应用能实现集中式日志吗?
EB Docker 应用可以集中管理日志:开启 CloudWatch Logs 集成、或在容器内运行日志采集 Agent、或直接把日志发到第三方平台。本文介绍各方案。
完全可以。主流方案有三种:一、开启 Elastic Beanstalk 的 CloudWatch Logs 集成(最简单,AWS 原生);二、在 Docker 容器内打包日志采集 Agent(如 Fluent Bit/DataKit)直发日志平台;三、应用直接把日志输出到外部日志服务。
方案一:CloudWatch Logs 集成(AWS 原生)
在 EB 控制台或 .ebextensions 中开启:
# .ebextensions/logging.config
option_settings:
aws:elasticbeanstalk:cloudwatch:logs:
StreamLogs: true
RetentionInDays: 14
开启后流式传输该平台已配置的日志文件,并非任意容器内文件都会自动采集;需核对平台分支、实例角色权限及应用日志路径,Compose 自定义日志还需配置相应挂载或采集。
方案二:容器内运行采集 Agent
可在支持 Docker Compose 的 EB Docker 平台中添加独立采集容器;这与旧 ECS 多容器平台或在应用 Dockerfile 内打包第二个进程不同:
# docker-compose.yml(EB 多容器环境)
services:
app:
image: myapp
log-collector:
image: fluent/fluent-bit
volumes:
- /var/lib/docker/containers:/var/lib/docker/containers:ro
该片段仅挂载目录,还需配置采集器输入、解析、检查点、输出和认证。路径假定 Docker 使用 json-file 驱动及默认数据目录,其他驱动或路径需调整。
方案三:应用直发
应用代码中直接把日志通过 HTTP/SDK 发送到日志平台,不依赖基础设施。缺点是和应用耦合。
采用采集器方案时,先确认 EB 实例上日志实际落盘的位置和轮转方式。观测云 DataKit 日志采集可读取指定文件;把应用、环境和实例标识保留在记录中,再测试一次新部署后的采集,确认实例替换不会遗漏配置。
常见问题(FAQ)
Q:EB 实例被替换后日志会丢吗?
A:只保存在被销毁实例上的日志可能丢失;已送达集中平台的副本按后端留存策略保留,但末尾尚未发送的缓冲日志仍可能丢失。
Q:CloudWatch Logs 费用高吗?
A:按采集量+存储量计费,日志量大时成本可观。可以只在生产环境开启,或缩短 RetentionInDays。
Q:eb logs 命令和集中日志什么关系?
A:默认获取尾部日志,也支持 --all/--zip;eb logs --cloudwatch-logs enable 可启用 CloudWatch 流式传输,--stream 可持续查看。长期存储仍取决于后端配置。