Amazon CloudWatch Logs 日志记录驱动程序
日志记录驱动程序awslogs
将容器日志发送到
Amazon CloudWatch Logs。可以通过
AWS 管理控制台或
AWS 开发工具包和命令行工具检索日志条目。
用法
要将awslogs
驱动程序用作默认日志记录驱动程序,请将log-driver
和log-opt
键设置为文件中的适当值daemon.json
,该文件位于/etc/docker/
Linux 主机或
C:\ProgramData\docker\config\daemon.json
Windows 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-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 \
...
笔记
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 |
%z | UTC 偏移量,格式为 +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-stream
和tag
时,为 提供的值
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_ID
、
AWS_SECRET_ACCESS_KEY
和AWS_SESSION_TOKEN
环境变量、默认 AWS 共享凭证文件(~/.aws/credentials
根用户的)提供这些凭证,或者如果您在 Amazon EC2 实例上运行 Docker 守护程序,则使用 Amazon EC2 实例配置文件。
凭据必须应用允许执行logs:CreateLogStream
和logs:PutLogEvents
操作的策略,如以下示例所示。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
"Effect": "Allow",
"Resource": "*"
}
]
}