Amazon CloudWatch Logs 日志记录驱动程序
这awslogs
logging 驱动程序将容器日志发送到 Amazon CloudWatch Logs。
日志条目可以通过 AWS 管理
控制台或 AWS 开发工具包
和命令行工具。
用法
要使用awslogs
driver 作为默认的日志记录驱动程序,将log-driver
和log-opt
keys 添加到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-区域)
这awslogs
logging 驱动程序将您的 Docker 日志发送到特定区域。用
这awslogs-region
log 选项或AWS_REGION
要设置的环境变量
区域。默认情况下,如果您的 Docker 守护程序在 EC2 实例上运行
并且未设置区域,则驱动程序使用实例的区域。
$ docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 ...
awslogs-endpoint
默认情况下,Docker 使用awslogs-region
log 选项或
检测到的区域来构建远程 CloudWatch Logs API 终端节点。
使用awslogs-endpoint
log 选项覆盖默认端点
使用提供的终端节点。
注意
这
awslogs-region
log 选项或 detected region 控制 用于签名的区域。如果 endpoint (终端节点)awslogs-endpoint
使用不同的区域。
awslogs-组
您必须为awslogs
logging 驱动程序。您可以使用awslogs-group
log 选项:
$ docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 --log-opt awslogs-group=myLogGroup ...
awslogs-stream
要配置应使用哪个日志流,您可以指定awslogs-stream
log 选项。如果不是
指定,则容器 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 \
...
注意
您的 AWS IAM 策略必须包含
logs:CreateLogGroup
权限 您尝试使用awslogs-create-group
.
awslogs-创建流
默认情况下,日志驱动程序会创建用于容器日志持久性的 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
option 定义多行起始模式蟒strftime
格式.日志消息由一行组成,该行
匹配 pattern 和任何与该 pattern 不匹配的后续行。因此
匹配的行是日志消息之间的分隔符。
使用 此格式用于解析输出,例如堆栈转储,否则可能会 记录在多个条目中。正确的模式允许将其捕获到 单条记录。
如果同时满足以下条件,则此选项始终优先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
value 可以设置为
该表达式:
$ 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
标记
指定tag
作为awslogs-stream
选择。tag
解释
Go 模板标记,例如{{.ID}}
,{{.FullID}}
或{{.Name}}
docker.{{.ID}}
.看
有关受支持模板的详细信息,请参见 tag option 文档
替换。
当两者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
选项 changes log flush interval seconds.
默认值为 5 秒。
awslogs-max-buffered-events
这awslogs
driver buffers 日志。
这awslogs-max-buffered-events
选项更改日志缓冲区大小。
默认值为 4K。
凭据
您必须向 Docker 守护程序提供 AWS 凭证才能使用awslogs
logging 驱动程序。您可以使用AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
和AWS_SESSION_TOKEN
环境变量、
默认 AWS 共享凭证文件 (~/.aws/credentials
root 用户)或
如果您在 Amazon EC2 实例上运行 Docker 守护程序,则 Amazon EC2
instance 配置文件。
凭证必须应用一个策略,该策略允许logs:CreateLogStream
和logs:PutLogEvents
作,如以下示例所示。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
"Effect": "Allow",
"Resource": "*"
}
]
}