Amazon CloudWatch Logs 日志驱动程序
awslogs
日志驱动程序将容器日志发送到 Amazon CloudWatch Logs。可以通过 AWS 管理控制台 或 AWS SDK 和命令行工具 中检索日志条目。
用法
要将awslogs
驱动程序用作默认日志驱动程序,请在daemon.json
文件中将log-driver
和log-opt
键设置为适当的值,该文件位于Linux主机的/etc/docker/
或Windows Server的C:\ProgramData\docker\config\daemon.json
中。有关使用daemon.json
配置Docker的更多信息,请参见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-region
awslogs
日志驱动程序会将您的 Docker 日志发送到特定区域。使用 awslogs-region
日志选项或 AWS_REGION
环境变量来设置区域。默认情况下,如果您的 Docker 守护进程在 EC2 实例上运行并且未设置区域,则驱动程序将使用实例的区域。
$ docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 ...
awslogs-endpoint
默认情况下,Docker 使用 awslogs-region
日志选项或检测到的区域来构建远程 CloudWatch Logs API 端点。使用 awslogs-endpoint
日志选项可以覆盖默认端点。
注意
awslogs-region
日志选项或检测到的区域控制用于签名的区域。如果您使用awslogs-endpoint
指定的端点使用不同的区域,则可能会遇到签名错误。
awslogs-group
您必须为 awslogs
日志驱动程序指定一个日志组。您可以使用 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-create-group
如果日志组不存在,则日志驱动程序默认返回错误。但是,您可以将 awslogs-create-group
设置为 true
以根据需要自动创建日志组。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 \
...
注意
在尝试使用
awslogs-create-group
之前,您的 AWS IAM 策略必须包含logs:CreateLogGroup
权限。
awslogs-create-stream
默认情况下,日志驱动程序会创建用于容器日志持久性的 AWS CloudWatch Logs 流。
将 awslogs-create-stream
设置为 false
以禁用日志流创建。禁用后,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-format
选项使用 Python 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 | 缩写星期几名称。 | Mon |
%A | 完整星期几名称。 | Monday |
%w | 星期几作为十进制数字,其中 0 是星期日,6 是星期六。 | 0 |
%d | 月份中的日期作为零填充的十进制数字。 | 08 |
%b | 月份缩写名称。 | Feb |
%B | 月份完整名称。 | February |
%m | 月份作为零填充的十进制数字。 | 02 |
%Y | 带世纪的年份作为十进制数字。 | 2008 |
%y | 不带世纪的年份作为零填充的十进制数字。 | 08 |
%H | 小时(24 小时制)作为零填充的十进制数字。 | 19 |
%I | 小时(12 小时制)作为零填充的十进制数字。 | 07 |
%p | 上午或下午。 | AM |
%M | 分钟作为零填充的十进制数字。 | 57 |
%S | 秒作为零填充的十进制数字。 | 04 |
%L | 毫秒作为零填充的十进制数字。 | .123 |
%f | 微秒作为零填充的十进制数字。 | 000345 |
%z | UTC 偏移量,格式为 +HHMM 或 -HHMM。 | +1300 |
%Z | 时区名称。 | PST |
%j | 一年中的日期作为零填充的十进制数字。 | 363 |
awslogs-multiline-pattern
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
指定 tag
作为 awslogs-stream
选项的替代方案。tag
解释 Go 模板标记,例如 {{.ID}}
、{{.FullID}}
或 {{.Name}}
docker.{{.ID}}
。有关支持的模板替换的详细信息,请参阅tag 选项文档。
同时指定 awslogs-stream
和 tag
时,awslogs-stream
的值会覆盖使用 tag
指定的模板。
如果未指定,则容器 ID 将用作日志流。
注意
CloudWatch 日志 API 不支持日志名称中的
:
。当使用{{ .ImageName }}
作为标签时,这可能会导致一些问题,因为 Docker 镜像的格式为IMAGE:TAG
,例如alpine: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
选项更改日志刷新间隔(秒)。
默认为 5 秒。
awslogs-max-buffered-events
awslogs
驱动程序会缓冲日志。
awslogs-max-buffered-events
选项更改日志缓冲区大小。
默认为 4K。
凭据
要使用 awslogs
日志驱动程序,您必须向 Docker 守护程序提供 AWS 凭据。您可以使用 AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和 AWS_SESSION_TOKEN
环境变量、默认的 AWS 共享凭据文件(root 用户的 ~/.aws/credentials
)提供这些凭据,或者如果您在 Amazon EC2 实例上运行 Docker 守护程序,则可以使用 Amazon EC2 实例配置文件。
凭据必须应用允许 logs:CreateLogStream
和 logs:PutLogEvents
操作的策略,如下例所示。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
"Effect": "Allow",
"Resource": "*"
}
]
}