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
开启后每个实例的容器日志自动流式传输到 CloudWatch Logs,在 CloudWatch 控制台统一查看。
方案二:容器内运行采集 Agent
在 Dockerfile 或 docker-compose(EB 多容器 Docker 平台)中加日志采集 sidecar:
# docker-compose.yml(EB 多容器环境)
services:
app:
image: myapp
log-collector:
image: fluent/fluent-bit
volumes:
- /var/lib/docker/containers:/var/lib/docker/containers:ro
Fluent Bit/DataKit 等采集器读取容器日志并发送到日志平台。
方案三:应用直发
应用代码中直接把日志通过 HTTP/SDK 发送到日志平台,不依赖基础设施。缺点是和应用耦合。
观测云对照
观测云 DataKit 支持部署为 EB Docker 环境的 sidecar 容器或直接安装在 EC2 实例上,采集容器日志和指标上报观测云;与 CloudWatch 相比,观测云提供更灵活的日志检索、Pipeline 清洗和告警配置。
常见问题(FAQ)
Q:EB 实例被替换后日志会丢吗?
A:会。EB 自动扩缩容时实例是临时的,这正是必须集中式日志的原因——实例销毁前把日志送走。
Q:CloudWatch Logs 费用高吗?
A:按采集量+存储量计费,日志量大时成本可观。可以只在生产环境开启,或缩短 RetentionInDays。
Q:eb logs 命令和集中日志什么关系?
A:eb logs 只是临时拉取各实例的日志快照查看,不是集中存储。真正的集中化需要上述方案之一。