Amazon CloudWatch Logs日志记录驱动程序
预计阅读时间:10分钟
该awslogs
日志驱动程序发送集装箱日志
亚马逊CloudWatch的日志。可以通过AWS管理控制台或AWS开发工具包和命令行工具检索日志条目。
用法
要将awslogs
驱动程序用作默认的日志记录驱动程序,请在Linux主机或Windows Server上
的文件中将log-driver
和log-opt
键设置为适当的值。有关使用来配置Docker的更多信息,请参见
daemon.json。下面的示例将日志驱动程序设置为并设置
选项。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选项
您可以在中添加日志记录选项以daemon.json
设置Docker范围内的默认值,或--log-opt NAME=VALUE
在启动容器时使用该标志指定Amazon CloudWatch Logs日志记录驱动程序选项。
awslogs-region
该awslogs
日志驱动程序发送您的码头工人日志的特定区域。使用awslogs-region
log选项或AWS_REGION
环境变量来设置区域。默认情况下,如果您的Docker守护程序在EC2实例上运行,并且未设置任何区域,则驱动程序将使用实例的区域。
$ docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 ...
awslogs端点
默认情况下,Docker使用awslogs-region
log选项或检测到的区域来构建远程CloudWatch Logs API端点。使用awslogs-endpoint
log选项使用提供的端点覆盖默认端点。
笔记
该
awslogs-region
日志选项或检测到的区域控制用于签名的区域。如果指定的端点awslogs-endpoint
使用其他区域,则可能会遇到签名错误。
awslogs组
您必须指定一个
日志组
为awslogs
日志驱动程序。您可以使用awslogs-group
log选项指定日志组
:
$ docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 --log-opt awslogs-group=myLogGroup ...
awslogs流
要配置
应使用的日志流,可以指定awslogs-stream
log选项。如果未指定,则将容器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 \
...
笔记
您的AWS IAM策略必须包含
logs:CreateLogGroup
权限,然后再尝试使用awslogs-create-group
。
awslogs-datetime格式
该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 multiline 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 multiline 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-multiline-pattern
该awslogs-multiline-pattern
选项使用正则表达式定义多行开始模式。日志消息由与模式匹配的行和与模式不匹配的任何后续行组成。因此,匹配的行是日志消息之间的分隔符。
如果awslogs-datetime-format
还配置了此选项,则将其忽略。
注意:多行日志记录对所有日志消息执行正则表达式解析和匹配。这可能会对日志记录性能产生负面影响。
例如,要处理以下日志流,其中新的日志消息以模式开头INFO
:
考虑以下日志流,其中每个日志消息均应以patther开头INFO
:
INFO A message was logged
INFO Another multiline 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 multiline message was logged
Some random message
# Third event
INFO Another message was logged
标签
指定tag
作为该awslogs-stream
选项的替代方法。tag
解释围棋模板标记,例如{{.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
证书
您必须向Docker守护程序提供AWS凭证才能使用awslogs
日志记录驱动程序。您可以提供这些凭证用AWS_ACCESS_KEY_ID
,
AWS_SECRET_ACCESS_KEY
以及AWS_SESSION_TOKEN
环境变量,默认AWS共享(证书文件~/.aws/credentials
root用户),或者如果你正在运行在Amazon EC2实例泊坞窗守护进程,在Amazon EC2实例配置文件。
凭据必须应用一个允许logs:CreateLogStream
和logs:PutLogEvents
操作的策略,如以下示例所示。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Effect": "Allow",
"Resource": "*"
}
]
}