Amazon CloudWatch Logs 日志驱动程序
awslogs 日志驱动程序将容器日志发送到
Amazon CloudWatch Logs。
日志条目可以通过
AWS 管理控制台 或
AWS SDKs 和命令行工具 检索。
用法
要将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 --log-driver=awslogs ...
如果您正在使用 Docker Compose,请使用以下声明示例设置 awslogs:
myservice:
logging:
driver: awslogs
options:
awslogs-region: us-east-1Amazon CloudWatch 日志选项
您可以将日志记录选项添加到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 代码受支持:
| Code | Meaning | Example |
|---|---|---|
%a | Weekday abbreviated name. | Mon |
%A | Weekday full name. | Monday |
%w | Weekday as a decimal number where 0 is Sunday and 6 is Saturday. | 0 |
%d | Day of the month as a zero-padded decimal number. | 08 |
%b | Month abbreviated name. | Feb |
%B | Month full name. | February |
%m | Month as a zero-padded decimal number. | 02 |
%Y | Year with century as a decimal number. | 2008 |
%y | Year without century as a zero-padded decimal number. | 08 |
%H | Hour (24-hour clock) as a zero-padded decimal number. | 19 |
%I | Hour (12-hour clock) as a zero-padded decimal number. | 07 |
%p | AM or PM. | AM |
%M | Minute as a zero-padded decimal number. | 57 |
%S | Second as a zero-padded decimal number. | 04 |
%L | Milliseconds as a zero-padded decimal number. | .123 |
%f | Microseconds as a zero-padded decimal number. | 000345 |
%z | UTC offset in the form +HHMM or -HHMM. | +1300 |
%Z | Time zone name. | PST |
%j | Day of the year as a zero-padded decimal number. | 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作为awslogs-stream选项的替代方案。tag解释
Go模板标记,例如{{.ID}}、{{.FullID}}
或{{.Name}} docker.{{.ID}}。有关支持的模板替换的详细信息,请参阅
标签选项文档。
当同时指定了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。
凭证
您必须向Docker守护进程提供AWS凭证以使用awslogs日志驱动程序。您可以通过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": "*"
}
]
}