Amazon CloudWatch Logs 日志记录驱动程序

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

用法

要使用awslogsdriver 作为默认的日志记录驱动程序,将log-driverlog-optkeys 添加到daemon.json文件,即 位于/etc/docker/在 Linux 主机上或C:\ProgramData\docker\config\daemon.json在 Windows Server 上。有关 使用 配置 Dockerdaemon.json,请参阅 daemon.json。 以下示例将日志驱动程序设置为awslogs并设置awslogs-region选择。

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

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

您可以使用--log-driver选项设置为docker run:

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

如果您使用的是 Docker Compose,请将awslogs使用以下声明示例:

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

Amazon CloudWatch Logs 选项

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

awslogs-region (awslogs-区域)

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

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

awslogs-endpoint

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

注意

awslogs-regionlog 选项或 detected region 控制 用于签名的区域。如果 endpoint (终端节点)awslogs-endpoint使用不同的区域。

awslogs-组

您必须awslogslogging 驱动程序。您可以使用awslogs-grouplog 选项:

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

awslogs-stream

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

注意

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

awslogs-create-group

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

$ 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:CreateLogGroup权限 您尝试使用awslogs-create-group.

awslogs-创建流

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

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

如果awslogs-create-stream设置为false并且日志流不存在,则记录持久性到 CloudWatch 在容器运行时失败,从而导致Failed 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

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

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

如果同时满足以下条件,则此选项始终优先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-formatvalue 可以设置为 该表达式:

$ 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

标记

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

当两者awslogs-streamtag指定,则为awslogs-stream覆盖使用tag.

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

注意

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

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

输出如下:alpine_latest-bf0072049c76

awslogs-force-flush-interval-seconds

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

awslogs-force-flush-interval-seconds选项 changes log flush interval seconds.

默认值为 5 秒。

awslogs-max-buffered-events

awslogsdriver buffers 日志。

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

默认值为 4K。

凭据

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

凭证必须应用一个策略,该策略允许logs:CreateLogStreamlogs:PutLogEvents作,如以下示例所示。

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