Amazon CloudWatch Logs 日志记录驱动程序

日志记录驱动程序将容器日志发送到 Amazon CloudWatch Logs。 日志条目可以通过 AWS 管理 控制台AWS 开发工具包 和命令行工具awslogs

用法

要将驱动程序用作默认日志记录驱动程序,请在文件中将 和 键设置为适当的值,即 位于 Linux 主机或 Windows Server 上。有关 使用 配置 Docker,请参阅 daemon.json。 以下示例将日志驱动程序设置为 并设置选项。awslogslog-driverlog-optdaemon.json/etc/docker/C:\ProgramData\docker\config\daemon.jsondaemon.jsonawslogsawslogs-region

{
  "log-driver": "awslogs",
  "log-opts": {
    "awslogs-region": "us-east-1"
  }
}

重新启动 Docker 以使更改生效。

您可以使用以下选项为特定容器设置日志记录驱动程序:--log-driverdocker run

$ docker run --log-driver=awslogs ...

如果您使用的是 Docker Compose,请使用以下声明示例进行设置:awslogs

myservice:
  logging:
    driver: awslogs
    options:
      awslogs-region: us-east-1

Amazon CloudWatch Logs 选项

您可以向 添加日志记录选项以设置 Docker 范围的默认值, 或使用标志指定 Amazon CloudWatch Logs Logging 驱动程序选项。daemon.json--log-opt NAME=VALUE

awslogs-region (awslogs-区域)

日志记录驱动程序将您的 Docker 日志发送到特定区域。用 log 选项或要设置的环境变量 区域。默认情况下,如果您的 Docker 守护程序在 EC2 实例上运行 并且未设置区域,则驱动程序使用实例的区域。awslogsawslogs-regionAWS_REGION

$ docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 ...

awslogs-endpoint

默认情况下,Docker 使用 log 选项或 检测到的区域来构建远程 CloudWatch Logs API 终端节点。 使用 log 选项覆盖默认端点 使用提供的终端节点。awslogs-regionawslogs-endpoint

注意

log 选项或检测到的区域控制 用于签名的区域。如果 endpoint (终端节点) 使用其他区域。awslogs-regionawslogs-endpoint

awslogs-组

您必须为日志记录驱动程序指定日志组。您可以使用 log 选项指定日志组:awslogsawslogs-group

$ docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 --log-opt awslogs-group=myLogGroup ...

awslogs-stream

要配置应使用的日志流,您可以指定 log 选项。如果不是 指定,则容器 ID 将用作日志流。awslogs-stream

注意

给定日志组中的日志流只能由一个容器使用 一次。同时对多个容器使用相同的日志流 可能会导致日志记录性能降低。

awslogs-create-group

如果日志组不存在,则日志驱动程序默认返回错误。但是,您可以将 设置为 以根据需要自动创建日志组。 该选项默认为 。awslogs-create-grouptrueawslogs-create-groupfalse

$ docker run \
    --log-driver=awslogs \
    --log-opt awslogs-region=us-east-1 \
    --log-opt awslogs-group=myLogGroup \
    --log-opt awslogs-create-group=true \
    ...

注意

您的 AWS IAM 策略必须包含之前的权限 您尝试使用 .logs:CreateLogGroupawslogs-create-group

awslogs-创建流

默认情况下,日志驱动程序会创建用于容器日志持久性的 AWS CloudWatch Logs 流。

设置为 to 以禁用日志流创建。禁用后,Docker 守护程序会假定 日志流已存在。这样做有益的一个用例是,当日志流创建由 另一个进程避免冗余的 AWS CloudWatch Logs API 调用。awslogs-create-streamfalse

如果设置为 且日志流不存在,则记录持久性到 CloudWatch 在容器运行时失败,导致守护程序日志中出现错误消息。awslogs-create-streamfalseFailed to put log events

$ docker run \
    --log-driver=awslogs \
    --log-opt awslogs-region=us-east-1 \
    --log-opt awslogs-group=myLogGroup \
    --log-opt awslogs-stream=myLogStream \
    --log-opt awslogs-create-stream=false \
    ...

awslogs-datetime-format

该选项以 Python strftime 格式定义多行开始模式。日志消息由一行组成,该行 匹配 pattern 和任何与该 pattern 不匹配的后续行。因此 匹配的行是日志消息之间的分隔符。awslogs-datetime-format

使用 此格式用于解析输出,例如堆栈转储,否则可能会 记录在多个条目中。正确的模式允许将其捕获到 单条记录。

如果同时配置了 和 ,则此选项始终优先。awslogs-datetime-formatawslogs-multiline-pattern

注意

多行日志记录执行所有日志的正则表达式解析和匹配 消息,这可能会对日志记录性能产生负面影响。

考虑以下日志流,其中新日志消息以 时间戳:

[May 01, 2017 19:00:01] A message was logged
[May 01, 2017 19:00:04] Another multi-line message was logged
Some random message
with some random words
[May 01, 2017 19:01:32] Another message was logged

格式可以表示为 的表达式,值可以设置为 该表达式:strftime[%b %d, %Y %H:%M:%S]awslogs-datetime-format

$ docker run \
    --log-driver=awslogs \
    --log-opt awslogs-region=us-east-1 \
    --log-opt awslogs-group=myLogGroup \
    --log-opt awslogs-datetime-format='\[%b %d, %Y %H:%M:%S\]' \
    ...

这会将日志解析为以下 CloudWatch 日志事件:

# First event
[May 01, 2017 19:00:01] A message was logged

# Second event
[May 01, 2017 19:00:04] Another multi-line message was logged
Some random message
with some random words

# Third event
[May 01, 2017 19:01:32] Another message was logged

支持以下代码:strftime

法典意义
%a工作日缩写名称。星期一
%A工作日全名。星期一
%w工作日为十进制数,其中 0 是星期日,6 是星期六。0
%d以填充零的十进制数表示的月份中的日期。08
%b月份缩写名称。2月
%B月份全名。二月
%mMonth 作为填充零的十进制数。02
%Y年份,以十进制数表示世纪。2008
%y不带世纪的年份,作为填充零的十进制数。08
%H小时 (24 小时制) 作为填充零的十进制数。19
%IHour (12 小时制) 作为填充零的十进制数。07
%pAM 或 PM。
%MMinute 作为填充零的十进制数。57
%SSecond 作为填充零的十进制数。04
%L毫秒数,以填充零的十进制数表示。.123
%f微秒作为填充零的十进制数。000345
%zUTC 偏移量,格式为 +HHMM 或 -HHMM。+1300
%Z时区名称。太平洋标准时间
%j以零填充十进制数表示的年份中的某一天。363

awslogs-多行模式

该选项使用 正则表达式。日志消息由与模式匹配的行 以及任何与模式不匹配的后续行。因此,匹配的行是 日志消息之间的分隔符。awslogs-multiline-pattern

如果还配置了此选项,则忽略此选项。awslogs-datetime-format

注意

多行日志记录执行所有日志的正则表达式解析和匹配 消息。这可能会对日志记录性能产生负面影响。

请考虑以下日志流,其中每条日志消息都应以 模式:INFO

INFO A message was logged
INFO Another multi-line message was logged
     Some random message
INFO Another message was logged

您可以使用 :^INFO

$ docker run \
    --log-driver=awslogs \
    --log-opt awslogs-region=us-east-1 \
    --log-opt awslogs-group=myLogGroup \
    --log-opt awslogs-multiline-pattern='^INFO' \
    ...

这会将日志解析为以下 CloudWatch 日志事件:

# First event
INFO A message was logged

# Second event
INFO Another multi-line message was logged
     Some random message

# Third event
INFO Another message was logged

标记

指定为选项的替代项。 解释 Go 模板标记,例如 、 或 .看 有关受支持模板的详细信息,请参见 tag option 文档 替换。tagawslogs-streamtag{{.ID}}{{.FullID}}{{.Name}}docker.{{.ID}}

如果同时指定了 和,则为 提供的值将覆盖使用 .awslogs-streamtagawslogs-streamtag

如果未指定,则使用容器 ID 作为日志流。

注意

CloudWatch 日志 API 不支持日志名称。这可能会导致 使用 as 标签时的一些问题, 因为 Docker 镜像的格式为 ,例如 . 模板标记可用于获取正确的格式。获取镜像名称 和容器 ID 的前 12 个字符,您可以使用::{{ .ImageName }}IMAGE:TAGalpine:latest

--log-opt tag='{{ with split .ImageName ":" }}{{join . "_"}}{{end}}-{{.ID}}'

输出如下:alpine_latest-bf0072049c76

awslogs-force-flush-interval-seconds

驱动程序会定期将日志刷新到 CloudWatch。awslogs

该选项更改 log flush interval 秒。awslogs-force-flush-interval-seconds

默认值为 5 秒。

awslogs-max-buffered-events

驱动程序缓冲日志。awslogs

该选项可更改日志缓冲区大小。awslogs-max-buffered-events

默认值为 4K。

凭据

您必须向 Docker 守护程序提供 AWS 凭证才能使用日志记录驱动程序。您可以使用 、 和环境变量 默认 AWS 共享凭证文件(根用户的),或 如果您在 Amazon EC2 实例上运行 Docker 守护程序,则 Amazon EC2 instance 配置文件。awslogsAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN~/.aws/credentials

凭证必须应用允许 and 操作的策略,如以下示例所示。logs:CreateLogStreamlogs:PutLogEvents

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}