Amazon CloudWatch Logs 日志记录驱动程序
日志记录驱动程序将容器日志发送到 Amazon CloudWatch Logs。
日志条目可以通过 AWS 管理
控制台或 AWS 开发工具包
和命令行工具。awslogs
用法
要将驱动程序用作默认日志记录驱动程序,请在文件中将 和 键设置为适当的值,即
位于 Linux 主机或 Windows Server 上。有关
使用 配置 Docker,请参阅 daemon.json。
以下示例将日志驱动程序设置为 并设置选项。awslogs
log-driver
log-opt
daemon.json
/etc/docker/
C:\ProgramData\docker\config\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 选项
您可以向 添加日志记录选项以设置 Docker 范围的默认值,
或使用标志指定 Amazon CloudWatch Logs
Logging 驱动程序选项。daemon.json
--log-opt NAME=VALUE
awslogs-region (awslogs-区域)
日志记录驱动程序将您的 Docker 日志发送到特定区域。用
log 选项或要设置的环境变量
区域。默认情况下,如果您的 Docker 守护程序在 EC2 实例上运行
并且未设置区域,则驱动程序使用实例的区域。awslogs
awslogs-region
AWS_REGION
$ docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 ...
awslogs-endpoint
默认情况下,Docker 使用 log 选项或
检测到的区域来构建远程 CloudWatch Logs API 终端节点。
使用 log 选项覆盖默认端点
使用提供的终端节点。awslogs-region
awslogs-endpoint
注意
log 选项或检测到的区域控制 用于签名的区域。如果 endpoint (终端节点) 使用其他区域。
awslogs-region
awslogs-endpoint
awslogs-组
您必须为日志记录驱动程序指定日志组。您可以使用 log 选项指定日志组:awslogs
awslogs-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-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 \
...
注意
您的 AWS IAM 策略必须包含之前的权限 您尝试使用 .
logs:CreateLogGroup
awslogs-create-group
awslogs-创建流
默认情况下,日志驱动程序会创建用于容器日志持久性的 AWS CloudWatch Logs 流。
设置为 to 以禁用日志流创建。禁用后,Docker 守护程序会假定
日志流已存在。这样做有益的一个用例是,当日志流创建由
另一个进程避免冗余的 AWS CloudWatch Logs API 调用。awslogs-create-stream
false
如果设置为 且日志流不存在,则记录持久性到 CloudWatch
在容器运行时失败,导致守护程序日志中出现错误消息。awslogs-create-stream
false
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
该选项以 Python strftime
格式定义多行开始模式。日志消息由一行组成,该行
匹配 pattern 和任何与该 pattern 不匹配的后续行。因此
匹配的行是日志消息之间的分隔符。awslogs-datetime-format
使用 此格式用于解析输出,例如堆栈转储,否则可能会 记录在多个条目中。正确的模式允许将其捕获到 单条记录。
如果同时配置了 和 ,则此选项始终优先。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 | 月份缩写名称。 | 2月 |
%B | 月份全名。 | 二月 |
%m | Month 作为填充零的十进制数。 | 02 |
%Y | 年份,以十进制数表示世纪。 | 2008 |
%y | 不带世纪的年份,作为填充零的十进制数。 | 08 |
%H | 小时 (24 小时制) 作为填充零的十进制数。 | 19 |
%I | Hour (12 小时制) 作为填充零的十进制数。 | 07 |
%p | AM 或 PM。 | 是 |
%M | Minute 作为填充零的十进制数。 | 57 |
%S | Second 作为填充零的十进制数。 | 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
标记
指定为选项的替代项。 解释
Go 模板标记,例如 、 或 .看
有关受支持模板的详细信息,请参见 tag option 文档
替换。tag
awslogs-stream
tag
{{.ID}}
{{.FullID}}
{{.Name}}
docker.{{.ID}}
如果同时指定了 和,则为 提供的值将覆盖使用 .awslogs-stream
tag
awslogs-stream
tag
如果未指定,则使用容器 ID 作为日志流。
注意
CloudWatch 日志 API 不支持日志名称。这可能会导致 使用 as 标签时的一些问题, 因为 Docker 镜像的格式为 ,例如 . 模板标记可用于获取正确的格式。获取镜像名称 和容器 ID 的前 12 个字符,您可以使用:
:
{{ .ImageName }}
IMAGE:TAG
alpine: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 配置文件。awslogs
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_SESSION_TOKEN
~/.aws/credentials
凭证必须应用允许 and 操作的策略,如以下示例所示。logs:CreateLogStream
logs:PutLogEvents
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
"Effect": "Allow",
"Resource": "*"
}
]
}