本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 awslogs 日志驱动程序
您可以将任务中的容器配置为将日志信息发送到 CloudWatch 日志。如果您对任务使用 Fargate 启动类型,则可以查看容器中的日志。如果您使用 EC2 启动类型,则可以在一个方便的位置查看容器中的不同日志,并防止您的容器日志占用您容器实例上的磁盘空间。本主题将详细介绍如何在任务定义中开始使用 awslogs
日志驱动程序。
注意
任务中的容器所记录的信息类型主要取决于其 ENTRYPOINT
命令。默认情况下,捕获的日志显示命令输出是您在本地运行容器时在交互式终端上通常看到的内容,即 STDOUT
和 STDERR
I/O 流。awslogs
日志驱动程序只需将这些日志从 Docker 传递到 Lo CloudWatch gs 即可。有关如何处理 Docker 日志的更多信息,包括捕获不同文件数据或流的替代方法,请参阅 Docker 文档中的查看容器或服务的日志
要将系统日志从您的 Amazon ECS 容器实例发送到 CloudWatch 日志,请参阅 Amazon CloudWatch 日志用户指南中的监控日志文件和 CloudWatch 日志配额。
启用容器的 awslogs 日志驱动程序
如果您对任务使用 Fargate 启动类型,您需要将所需的 logConfiguration
参数添加到您的任务定义才能打开 awslogs
日志驱动程序。有关更多信息,请参阅在任务定义中指定日志配置:
如果您对任务使用 EC2 启动类型,并且想要打开 awslogs
日志驱动程序,您的 Amazon ECS 容器实例至少需要容器代理的 1.9.0 版本。有关如何检查您的代理版本并更新到最新版本的信息,请参阅更新 Amazon ECS 容器代理。
注意
如果对容器实例使用的不是针对经 Amazon ECS 优化的 AMI(至少具有 1.9.0-1 版本的 ecs-init
程序包),则还需要指定当您通过在 docker run 语句或环境变量文件中使用以下环境变量启动代理时,awslogs
日志记录驱动程序在容器实例上可用。有关更多信息,请参阅安装 Amazon ECS 容器代理:
ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","
awslogs
"]
Amazon ECS 容器实例还需要针对您用于启动容器实例的 IAM 角色的 logs:CreateLogStream
和 logs:PutLogEvents
权限。如果在 Amazon ECS 中启用 awslogs
日志驱动程序支持之前创建了 Amazon ECS 容器实例,可能需要添加此权限。ecsTaskExecutionRole
在将其分配给任务时使用,并且可能包含正确的权限。有关检查任务执行角色的信息,请参阅 在 IAM 控制台中检查任务执行 (ecsTaskExecutionRole) 角色。如果您的容器实例使用容器实例的托管 IAM policy,您的容器实例可能具有正确的权限。有关如何检查 Amazon ECS 容器实例角色并为容器实例附加托管 IAM policy 的信息,请参阅 在 IAM 控制台中检查容器实例 (ecsInstanceRole)。
创建日志组
awslogs
日志驱动程序可以将日志流发送到日志中的现有 CloudWatch 日志组或代表您创建新的日志组。AWS Management Console 提供了一个自动配置选项,该选项将使用具有 ecs
的任务定义系列名称作为前缀代表您创建日志组。或者,您可以手动指定日志配置选项,并使用 true
值指定 awslogs-create-group
选项,该选项将代表您创建日志组。
注意
要使用创建日志组的awslogs-create-group
选项,您的任务执行 IAM 角色策略或 EC2 实例角色策略必须包含该logs:CreateLogGroup
权限。
以下代码演示如何设置 awslogs-create-group
选项。
{ "containerDefinitions": [ { "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "firelens-container", "awslogs-region": "us-west-2", "awslogs-create-group": "true", "awslogs-stream-prefix": "firelens" } } ] }
使用自动配置功能创建日志组
当您在 Amazon ECS 控制台中注册任务定义时,可以允许 Amazon ECS 自动配置您的 CloudWatch 日志。执行此操作可以通过使用具有 ecs
的任务定义系列名称作为前缀代表您创建日志组。有关更多信息,请参阅使用控制台创建任务定义:
可用的 awslogs 日志驱动程序选项
awslogs
日志驱动程序支持 Amazon ECS 任务定义中的下列选项。有关更多信息,请参阅CloudWatch 日志记录驱动程序
awslogs-create-group
-
必需:否
指定您是否希望自动创建日志组。如果未指定此选项,则默认为
false
。注意
您的 IAM policy 必须包含
logs:CreateLogGroup
权限,然后才能尝试使用awslogs-create-group
。 awslogs-region
-
必需:是
指定
awslogs
日志驱动程序要将 Docker 日志发送到的 AWS 区域。您可以选择将位于不同区域的集群中的所有日志发送到 CloudWatch 日志中的单个区域。这是为了使它们都在一个位置可见。否则,您可以按区域对它们进行分隔以获得更高粒度。确保指定的日志组存在于您使用此选项指定的区域中。 awslogs-group
-
必需:是
确保指定
awslogs
日志驱动程序将其日志流发送到的日志组。有关更多信息,请参阅创建日志组: awslogs-stream-prefix
-
必需:EC2 启动类型可选,EC2 启动类型是必需的。
利用
awslogs-stream-prefix
选项,可将日志流与指定的前缀、容器名称和容器所属的 Amazon ECS 任务的 ID 关联在一起。如果您使用此选项指定前缀,则日志流将采用以下格式。prefix-name
/container-name
/ecs-task-id
如果您未使用此选项指定前缀,则日志流将以 Docker 进程守护程序在容器实例上分配的容器 ID 命名。由于仅使用 Docker 容器 ID(仅在容器实例上可用)很难将日志回溯到发送它们的容器,因此,我们建议您使用此选项指定前缀。
对于 Amazon ECS 服务,您可以使用服务名称作为前缀。这样,您可以将日志流跟踪到容器所属的服务、发送日志流的容器的名称以及该容器所属的任务的 ID。
您必须为日志指定流前缀,才能在使用 Amazon ECS 控制台时在日志窗格中显示日志。
awslogs-datetime-format
-
必需:否
此选项以 Python
strftime
格式定义多行开始位置模式。日志消息由与模式匹配的行以及与模式不匹配的任何以下行组成。匹配行是日志消息之间的分隔符。使用此格式的一个使用案例示例是用于解析输出(如堆栈转储),这可能记录在多个条目中。正确模式允许它捕获在单个条目中。
有关更多信息,请参阅awslogs-datetime-format
。 您无法同时配置
awslogs-datetime-format
和awslogs-multiline-pattern
选项。注意
多行日志记录对所有日志消息执行正则表达式解析和匹配。这可能会对日志记录性能产生负面影响。
awslogs-multiline-pattern
-
必需:否
此选项使用正则表达式定义多行开始位置模式。日志消息由与模式匹配的行以及与模式不匹配的任何以下行组成。匹配行是日志消息之间的分隔符。
有关更多信息,请参阅awslogs-multiline-pattern
。 如果还配置了
awslogs-datetime-format
,则会忽略此选项。您无法同时配置
awslogs-datetime-format
和awslogs-multiline-pattern
选项。注意
多行日志记录对所有日志消息执行正则表达式解析和匹配。这可能会对日志记录性能产生负面影响。
mode
-
必需:否
有效值:
non-blocking
|blocking
默认值:
blocking
此选项定义了从容器到 Log CloudWatch s 的日志消息的传送模式。当从容器到容器的日志流中断时,您选择的交付模式会影响应用程序的 CloudWatch 可用性。
如果您使用默认
blocking
模式并且日志流中断, CloudWatch 则来自容器代码写入stdout
和stderr
流的调用将被阻塞。因此,应用程序的日志线程将阻塞。这可能会导致应用程序失去响应并导致容器运行状况检查失败。如果您使用该
non-blocking
模式,则容器的日志将存储在配置了该max-buffer-size
选项的内存中中间缓冲区中。这样可以防止应用程序在无法将日志发送到 CloudWatch时变得无响应。如果您想确保服务可用性并且可以接受一些日志丢失,我们建议您使用此模式。 max-buffer-size
-
必需:否
默认值:
1m
使用
non-blocking
模式时,max-buffer-size
日志选项控制用于中间消息存储的缓冲区的大小。确保根据您的应用程序指定足够的缓冲区大小。当缓冲区已满时,将无法存储更多日志。无法存储的日志会丢失。
在任务定义中指定日志配置
在您的容器可以向其发送日志之前 CloudWatch,您必须在任务定义中为容器指定awslogs
日志驱动程序。此部分描述了为使用 awslogs
日志驱动程序而进行的容器日志配置。有关更多信息,请参阅使用控制台创建任务定义:
下面的任务定义 JSON 有一个为每个容器指定的 logConfiguration
对象。一种用于将日志发送到名为的日志组的 WordPress 容器awslogs-wordpress
。另一个是用于将日志发送到名为 awslogs-mysql
的日志组的 MySQL 容器。两个容器都使用 awslogs-example
日志流前缀。
{ "containerDefinitions": [ { "name": "wordpress", "links": [ "mysql" ], "image": "wordpress", "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": "mysql", "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" }
在容器定义日志配置中向awslogs
日志驱动程序注册任务定义后,您可以运行任务或使用该任务定义创建服务,开始向日志发送日 CloudWatch 志。有关更多信息,请参阅 在经典 Amazon ECS 控制台中运行独立任务 和 在经典控制台中创建 Amazon ECS 服务。
在日志中查看 awslogs 容器日志 CloudWatch
对于使用 EC2 启动类型的任务,在您的容器实例角色具有向日志发送日志的适当权限,您的容器代理至少更新到版本 1.9.0,并且您已经配置并启动了使用awslogs
日志驱动程序的容器的任务之后,您配置的容器应将其日志数据发送到 CloudWatch Log CloudWatch s。您可在控制台中查看和搜索这些日志。
从 Amazon ECS 控制台查看容器的 CloudWatch 日志数据
-
在 Clusters 页上,选择包含要查看的任务的集群。
-
在 “集群:集
群名称
” 页面上,选择 “任务”,然后选择要查看的任务。 -
在任务:
task_id
页面的容器详细信息下,选择日志配置以查看日志。 -
在日志配置部分,选择查看日志 CloudWatch,这将在 CloudWatch 控制台中打开关联的日志流。
在 CloudWatch 控制台中查看您的 CloudWatch 日志数据
打开 CloudWatch 控制台,网址为 https://console.aws.amazon.com/cloudwatch/
。 -
在左侧导航窗格中,选择 Logs。
-
选择要查看的日志组。您应该会看到在创建日志组中创建的日志组。
-
选择要查看的日志流。