Amazon CloudWatch Logs 日志记录驱动程序

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

用法

要将awslogs驱动程序用作默认日志记录驱动程序,请将log-driverlog-opt键设置为文件中的适当值daemon.json,该文件位于/etc/docker/Linux 主机或 C:\ProgramData\docker\config\daemon.jsonWindows Server 上。有关使用配置 Docker 的更多信息daemon.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 日志记录驱动程序选项。

awslogs-区域

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

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

awslogs-端点

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

笔记

日志awslogs-region选项或检测到的区域控制用于签名的区域。如果您指定的终端节点awslogs-endpoint使用不同的区域,您可能会遇到签名错误。

awslogs-组

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

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

awslogs-stream

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

笔记

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

awslogs-创建组

如果日志组不存在,日志驱动程序默认返回错误。但是,您可以设置 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 \
    ...

笔记

logs:CreateLogGroup在尝试使用 之前,您的 AWS IAM 策略必须包含该权限awslogs-create-group

awslogs 日期时间格式

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

使用此格式的用例的一个示例是用于解析堆栈转储等输出,否则该输出可能会记录在多个条目中。正确的模式允许在单个条目中捕获它。

如果同时配置了awslogs-datetime-format和 , 则此选项始终优先。awslogs-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月份缩写名称。二月
%B月份全名。二月
%m以零填充的十进制数表示的月份。02
%Y以十进制数表示的年份和世纪。2008年
%y不带世纪的年份作为补零十进制数。08
%H小时(24 小时制),以零填充的十进制数。19
%I小时(12 小时制),以零填充的十进制数。07
%p上午或下午。
%M分钟作为补零十进制数。57
%S第二个是补零的十进制数。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}}。有关支持的模板替换的详细信息,请参阅 标签选项文档。

当同时指定awslogs-streamtag时,为 提供的值 awslogs-stream将覆盖用 指定的模板tag

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

笔记

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

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

输出类似于:alpine_latest-bf0072049c76

awslogs-force-flush-间隔秒

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

awslogs-force-flush-interval-seconds选项更改日志刷新间隔秒数。

默认值为 5 秒。

awslogs-最大缓冲事件

驱动awslogs程序缓冲日志。

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

默认为 4K。

证书

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

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

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