ECS跑多个容器,每个容器有自己的日志。出问题了,要去每个容器里查日志,很麻烦。把日志集中到一个地方,就方便多了。CloudWatch Logs是AWS的日志服务,ECS可以直接把日志发过去。这篇文章教你配置。
在任务定义的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”的日志流
ECS要把日志发到CloudWatch,需要权限。在任务执行角色里加策略:
json
复制下载
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ]}
可以用AWS托管策略“CloudWatchLogsFullAccess”,或者自己建一个。
进CloudWatch控制台
点“日志”->“日志组”
找到/ecs/my-app
点进去,可以看到每个容器的日志流
点一个日志流,就能看到日志内容
日志多了,一行行翻很慢。用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天前的日志自动删除,不用管。
普通日志是一行文本,比如:
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"}
查起来方便,可以按字段过滤。
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))
有了JSON日志,查询更强大:
text
复制下载
fields @timestamp, level, user_id, message| filter level = 'ERROR' and user_id = 123| sort @timestamp desc
只查某个用户的错误日志,很方便。
可以把日志里的特定模式转成指标,然后设置告警。
在日志组里,点“创建指标过滤器”
过滤模式:比如“ERROR”,匹配所有包含ERROR的行
指标名称:ErrorCount
点“创建”
进CloudWatch告警,点“创建告警”
选刚创建的ErrorCount指标
条件:比如大于10,持续5分钟
动作:发邮件到运维团队
这样,5分钟内出现10次以上错误,就告警。
检查:
任务执行角色有没有logs:PutLogEvents权限
任务定义里的日志组名称对不对
日志组有没有先创建(ECS会自动创建,但权限要够)
设置保留期,自动删旧的
在应用里减少不必要的日志
用INFO级别,不用DEBUG
CloudWatch Logs有少量延迟(几秒到十几秒),正常。要实时日志,可以考虑用Kinesis。
ECS日志配置很简单,在任务定义里加几行配置就行。日志集中到CloudWatch,查询方便,还可以设置告警。结构化日志让查询更强大。养成把日志集中管理的习惯,排查问题就方便多了。
如果需要更深入咨询了解可以联系全球代理上TG:jinniuge 他们在云平台领域有更专业的知识和建议,他们有国际阿里云,国际腾讯云,国际华为云,aws亚马逊,谷歌云一级代理的渠道,客服1V1服务,支持免实名、免备案、免绑卡。开通即享专属VIP优惠、充值秒到账、官网下单享双重售后支持。不懂找他们就对了。