ECS日志收集实战,用CloudWatch Logs集中管理日志

云服务2026年03月22日

ECS日志收集实战CloudWatch Logs集中管理日志

引言:日志分散在多个容器里,怎么查?

ECS跑多个容器,每个容器有自己的日志。出问题了,要去每个容器里查日志,很麻烦。把日志集中到一个地方,就方便多了。CloudWatch Logs是AWS的日志服务,ECS可以直接把日志发过去。这篇文章教你配置。

一、ECS日志配置

1.1 在任务定义里配置日志

在任务定义的containerDefinitions里,加logConfiguration:

json

复制下载

{  "containerDefinitions": [    {      "name": "my-app",      "image": "123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest",      "logConfiguration": {        "logDriver": "awslogs",        "options": {          "awslogs-group": "/ecs/my-app",          "awslogs-region": "us-east-1",          "awslogs-stream-prefix": "app"        }      }    }  ]}

参数说明:

awslogs-group:日志组名称,在CloudWatch里会创建这个组

awslogs-region:日志发到哪个区域,和ECS在同一区域

awslogs-stream-prefix:日志流前缀,每个容器会生成类似“app/容器ID”的日志流

1.2 给任务执行角色加权限

ECS要把日志发到CloudWatch,需要权限。在任务执行角色里加策略:

json

复制下载

{  "Version": "2012-10-17",  "Statement": [    {      "Effect": "Allow",      "Action": [        "logs:CreateLogGroup",        "logs:CreateLogStream",        "logs:PutLogEvents"      ],      "Resource": "*"    }  ]}

可以用AWS托管策略“CloudWatchLogsFullAccess”,或者自己建一个。

二、查看日志

2.1 在CloudWatch控制台看

CloudWatch控制台

“日志”->“日志组”

找到/ecs/my-app

点进去,可以看到每个容器的日志流

点一个日志流,就能看到日志内容

2.2 用CloudWatch Logs Insights查

日志多了,一行行翻很慢。用Logs Insights可以快速搜索。

在日志组页面,点“使用Logs Insights查询”

输入查询语句,比如:

text

复制下载

fields @timestamp, @message| filter @message like /ERROR/| sort @timestamp desc| limit 20

找出所有包含ERROR的日志,按时间倒序,取20条。

还可以按容器查:

text

复制下载

fields @timestamp, @message, @logStream| filter @logStream like /app-xxx/| sort @timestamp desc

三、日志保留期设置

默认日志永久保存,时间长了费用不低。设置保留期,过期自动删。

在日志组页面,点“保留”

选保留期,比如30天

这样30天前的日志自动删除,不用管。

四、应用里写结构化日志

4.1 什么是结构化日志

普通日志是一行文本,比如:

text

复制下载

2024-01-01 12:00:00 ERROR User 123 login failed

查起来不方便,只能用字符串匹配。

结构化日志是JSON格式,比如:

json

复制下载

{"timestamp":"2024-01-01T12:00:00Z","level":"ERROR","user_id":123,"message":"login failed"}

查起来方便,可以按字段过滤。

4.2 在应用里写JSON日志

Python示例:

python

复制下载

import jsonimport logginglogger = logging.getLogger()logger.setLevel(logging.INFO)def log_error(user_id, message):    log_entry = {        "timestamp": datetime.utcnow().isoformat(),        "level": "ERROR",        "user_id": user_id,        "message": message    }    logger.error(json.dumps(log_entry))

4.3 用Logs Insights查结构化日志

有了JSON日志,查询更强大:

text

复制下载

fields @timestamp, level, user_id, message| filter level = 'ERROR' and user_id = 123| sort @timestamp desc

只查某个用户的错误日志,很方便。

五、日志告警

5.1 创建指标过滤器

可以把日志里的特定模式转成指标,然后设置告警。

在日志组里,点“创建指标过滤器”

过滤模式:比如“ERROR”,匹配所有包含ERROR的行

指标名称:ErrorCount

“创建”

5.2 创建告警

CloudWatch告警,点“创建告警”

选刚创建的ErrorCount指标

条件:比如大于10,持续5分钟

动作:发邮件到运维团队

这样,5分钟内出现10次以上错误,就告警。

六、常见问题

6.1 日志没发出去

检查:

任务执行角色有没有logs:PutLogEvents权限

任务定义里的日志组名称对不对

日志组有没有先创建(ECS会自动创建,但权限要够)

6.2 日志太多,费用高

设置保留期,自动删旧的

在应用里减少不必要的日志

INFO级别,不用DEBUG

6.3 日志延迟

CloudWatch Logs有少量延迟(几秒到十几秒),正常。要实时日志,可以考虑用Kinesis。

七、结语

ECS日志配置很简单,在任务定义里加几行配置就行。日志集中到CloudWatch,查询方便,还可以设置告警。结构化日志让查询更强大。养成把日志集中管理的习惯,排查问题就方便多了。

如果需要更深入咨询了解可以联系全球代理上TG:jinniuge  他们在云平台领域有更专业的知识和建议,他们有国际阿里云,国际腾讯云,国际华为云,aws亚马逊,谷歌云一级代理的渠道,客服1V1服务,支持免实名、免备案、免绑卡。开通即享专属VIP优惠、充值秒到账、官网下单享双重售后支持。不懂找他们就对了。

 


联系我们
添加企业微信

云服务不是完美的,我们渴望您的建议。

X