

# 将 Amazon ECS 日志发送到 CloudWatch
<a name="using_awslogs"></a>

您可在任务中配置容器以将日志信息发送到 CloudWatch Logs。如果您对任务使用 Fargate，则可以查看容器中的日志。如果您使用 EC2，则可以在一个方便的位置查看容器中的不同日志，并防止您的容器日志占用您容器实例上的磁盘空间。

**注意**  
任务中的容器所记录的信息类型主要取决于其 `ENTRYPOINT` 命令。默认情况下，捕获的日志显示命令输出是您在本地运行容器时在交互式终端上通常看到的内容，即 `STDOUT` 和 `STDERR` I/O 流。`awslogs`日志驱动程序只是将 Docker 中的这些日志传递到 CloudWatch Logs。有关如何处理 Docker 日志的更多信息，包括捕获不同文件数据或流的替代方法，请参阅 Docker 文档中的[查看容器或服务的日志](https://docs.docker.com/engine/logging/)。

要将系统日志从 Amazon ECS 容器实例发送到 CloudWatch Logs，请参阅《Amazon CloudWatch Logs 用户指南》**中的[监控日志文件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchLogs.html)和 [CloudWatch Logs 配额](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html)。

## Fargate
<a name="enable_awslogs"></a>

如果您对任务使用 Fargate，您需要将所需的 `logConfiguration` 参数添加到您的任务定义才能打开 `awslogs` 日志驱动程序。有关更多信息，请参阅 [Amazon ECS 任务定义示例：将日志路由到 CloudWatch](specify-log-config.md)。

对于 Fargate 上的 Windows 容器，当您的任何任务定义参数包含特殊字符（例如 `& \ < > ^ |`）时，请执行以下选项之一：
+ 在整个参数字符串周围添加一个带有双引号的 escape（`\`）字符

  示例

  ```
  "awslogs-multiline-pattern": "\"^[|DEBUG|INFO|WARNING|ERROR\"",
  ```
+ 在每个特殊字符周围添加一个 escape（`^`）字符

  示例

  ```
  "awslogs-multiline-pattern": "^^[^|DEBUG^|INFO^|WARNING^|ERROR",
  ```

## EC2
<a name="ec2-considerations"></a>

如果您对任务使用 EC2，并且想要打开 `awslogs` 日志驱动程序，您的 Amazon ECS 容器实例至少需要容器代理的 1.9.0 版本。有关如何检查您的代理版本并更新到最新版本的信息，请参阅[更新 Amazon ECS 容器代理](ecs-agent-update.md)。

**注意**  
您必须使用经 Amazon ECS 优化的 AMI 或至少包含 `ecs-init` 软件包版本 `1.9.0-1` 的自定义 AMI。使用自定义 AMI 时，如果在 **docker run** 语句或环境变量文件中使用以下环境变量启动代理，您必须指定 `awslogs` 日志驱动程序在 Amazon EC2 实例上可用。  

```
ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","awslogs"]
```

Amazon ECS 容器实例还需要针对您用于启动容器实例的 IAM 角色的 `logs:CreateLogStream` 和 `logs:PutLogEvents` 权限。如果在 Amazon ECS 中启用 `awslogs` 日志驱动程序支持之前创建了 Amazon ECS 容器实例，可能需要添加此权限。`ecsTaskExecutionRole` 在将其分配给任务时使用，并且可能包含正确的权限。有关任务执行角色的信息，请参阅[Amazon ECS 任务执行 IAM 角色](task_execution_IAM_role.md)。如果您的容器实例使用容器实例的托管 IAM 策略，您的容器实例可能具有正确的权限。有关容器实例的托管 IAM 策略的信息，请参阅[Amazon ECS 容器实例 IAM 角色](instance_IAM_role.md)。

# Amazon ECS 任务定义示例：将日志路由到 CloudWatch
<a name="specify-log-config"></a>

必须先在任务定义中为容器指定 `awslogs` 日志驱动程序，容器才能将日志发送到 CloudWatch。有关日志参数的更多信息，请参阅 [存储和日志记录](task_definition_parameters.md#container_definition_storage)

下面的任务定义 JSON 有一个为每个容器指定的 `logConfiguration` 对象。一个是用于将日志发送到名为 `awslogs-wordpress` 的日志组的 WordPress 容器。另一个是用于将日志发送到名为 `awslogs-mysql` 的日志组的 MySQL 容器。两个容器都使用`awslogs-example`日志流前缀。

```
{
    "containerDefinitions": [
        {
            "name": "wordpress",
            "links": [
                "mysql"
            ],
            "image": "public.ecr.aws/docker/library/wordpress:latest",
            "essential": true,
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 80
                }
            ],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-create-group": "true",
                    "awslogs-group": "awslogs-wordpress",
                    "awslogs-region": "us-west-2",
                    "awslogs-stream-prefix": "awslogs-example"
                }
            },
            "memory": 500,
            "cpu": 10
        },
        {
            "environment": [
                {
                    "name": "MYSQL_ROOT_PASSWORD",
                    "value": "password"
                }
            ],
            "name": "mysql",
            "image": "public.ecr.aws/docker/library/mysql:latest",
            "cpu": 10,
            "memory": 500,
            "essential": true,
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-create-group": "true",
                    "awslogs-group": "awslogs-mysql",
                    "awslogs-region": "us-west-2",
                    "awslogs-stream-prefix": "awslogs-example",
                    "mode": "non-blocking", 
                    "max-buffer-size": "25m" 
                }
            }
        }
    ],
    "family": "awslogs-example"
}
```

## 后续步骤
<a name="specify-log-config-next-steps"></a>
+ 您可以选择使用 CloudWatch AWS CLI 或 API 为日志组设置保留策略。有关更多信息，请参阅《AWS Command Line Interface 命令参考》中的 [put-retention-policy](https://docs.aws.amazon.com/cli/latest/reference/logs/put-retention-policy.html)**。
+ 在容器定义日志配置中向 `awslogs` 日志驱动程序注册任务定义之后，可运行任务或使用此任务定义创建服务以开始将日志发送到 CloudWatch Logs。有关更多信息，请参阅[将应用程序作为 Amazon ECS 任务运行](standalone-task-create.md)和[创建 Amazon ECS 滚动更新部署](create-service-console-v2.md)。