You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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. 部署验证

  1. 重新构建包含修改后script.py的Docker镜像,并推送到ECR仓库。
  2. 更新CloudFormation栈或直接更新ECS任务定义,使用新的镜像版本。
  3. 启动Fargate任务后,登录AWS控制台进入CloudWatch,找到目标日志组/ecs/my_log_group,即可查看任务输出的日志内容。

内容的提问来源于stack exchange,提问作者ozil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:46:07