如何在Fargate任务中通过Python日志器写入指定AWS CloudWatch日志组?
问题描述
我已通过CloudFormation模板(如下示例)完成Fargate任务部署,任务代码位于script.py(如下代码)。目前任务运行正常,需将日志写入AWS CloudWatch,且已创建对应日志组,计划使用Python日志器实现,请问如何操作?
CloudFormation模板示例
AWSTemplateFormatVersion: 2010-09-09 Description: An example CloudFormation template for Fargate. Parameters: VPC: Type: AWS::EC2::VPC::Id SubnetA: Type: AWS::EC2::Subnet::Id SubnetB: Type: AWS::EC2::Subnet::Id Image: Type: String Default: 123456789012.dkr.ecr.region.amazonaws.com/image:tag Resources: Cluster: Type: AWS::ECS::Cluster Properties: ClusterName: !Join ['', [!Ref ServiceName, Cluster]] TaskDefinition: Type: AWS::ECS::TaskDefinition DependsOn: LogGroup Properties: Family: !Join ['', [!Ref ServiceName, TaskDefinition]] NetworkMode: awsvpc RequiresCompatibilities: - FARGATE Cpu: 256 Memory: 2GB ExecutionRoleArn: !Ref ExecutionRole TaskRoleArn: !Ref TaskRole ContainerDefinitions: - Name: !Ref ServiceName Image: !Ref Image LogConfiguration: LogDriver: awslogs Options: awslogs-group: '/ecs/my_log_group' awslogs-region: 'us-east-1' awslogs-stream-prefix: ecs-myfargatetask
任务代码script.py
import logging logger = logging.getlogger('...') logger.info('logging working')
实现步骤
1. 确认CloudFormation日志配置有效性
- 检查执行角色权限:确保
ExecutionRole拥有CloudWatch日志的写入权限,需包含以下权限策略:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:us-east-1:你的账号ID:log-group:/ecs/my_log_group:*" } ] } - 核对日志配置参数:确认
LogConfiguration中的awslogs-group、awslogs-region与你创建的日志组信息完全匹配;awslogs-stream-prefix可根据需求调整,用于区分不同任务的日志流。 - 日志组依赖处理:模板中
TaskDefinition依赖LogGroup资源,若你是手动创建的日志组,需确保该日志组已存在,或在模板中添加LogGroup资源定义:LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: '/ecs/my_log_group' RetentionInDays: 30
2. 配置Python日志器输出到标准流
Fargate的awslogs驱动会自动收集容器的标准输出(stdout)和标准错误(stderr)并发送到CloudWatch,因此只需将Python日志输出到这两个流即可。修改script.py如下:
import logging import sys # 配置日志器 logger = logging.getLogger('fargate_task_logger') logger.setLevel(logging.INFO) # 创建标准输出处理器 handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.INFO) # 设置日志格式(可选,建议包含时间、级别、内容) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) # 将处理器添加到日志器 logger.addHandler(handler) # 测试日志 logger.info('logging working') logger.error('这是一条错误日志')
- 注意:原代码中
logging.getlogger是拼写错误,正确写法为logging.getLogger(首字母大写)。 - 若需要同时输出到stderr,可添加
logging.StreamHandler(sys.stderr)处理器。
3. 部署验证
- 重新构建包含修改后
script.py的Docker镜像,并推送到ECR仓库。 - 更新CloudFormation栈或直接更新ECS任务定义,使用新的镜像版本。
- 启动Fargate任务后,登录AWS控制台进入CloudWatch,找到目标日志组
/ecs/my_log_group,即可查看任务输出的日志内容。
内容的提问来源于stack exchange,提问作者ozil
相关产品推荐
相关产品推荐

