Docker 日志驱动程序插件
本文档描述了 Docker 的日志驱动程序插件。
日志驱动程序使用户能够将容器日志转发到另一个服务进行处理。Docker 包含一些内置的日志驱动程序,但是永远无法期望通过内置驱动程序支持所有用例。插件允许 Docker 支持各种日志服务,而无需在主要的 Docker 代码库中嵌入这些服务的客户端库。有关更多信息,请参见插件文档。
创建日志插件
日志插件的主要接口使用与其他插件类型相同的 JSON+HTTP RPC 协议。请参阅示例插件,了解日志插件的参考实现。此示例包装了内置的jsonfilelog
日志驱动程序。
LogDriver 协议
日志插件必须在插件激活期间注册为LogDriver
。激活后,用户可以将插件指定为日志驱动程序。
日志插件必须实现两个 HTTP 端点
/LogDriver.StartLogging
向插件发出信号,指示容器正在启动,插件应该开始接收其日志。
日志将通过请求中定义的文件进行流式传输。在 Linux 上,此文件是 FIFO。目前在 Windows 上不支持日志插件。
请求
{
"File": "/path/to/file/stream",
"Info": {
"ContainerID": "123456"
}
}
File
是需要使用的日志流的路径。每次调用StartLogging
都应提供不同的文件路径,即使是插件之前已经接收过其日志的容器也是如此。该文件由 Docker 使用随机生成的名称创建。
Info
是有关正在记录的容器的详细信息。这相当自由,但由以下结构定义定义
type Info struct {
Config map[string]string
ContainerID string
ContainerName string
ContainerEntrypoint string
ContainerArgs []string
ContainerImageID string
ContainerImageName string
ContainerCreated time.Time
ContainerEnv []string
ContainerLabels map[string]string
LogPath string
DaemonName string
}
此结构始终会提供ContainerID
,但其他字段可能为空或缺失。
响应
{
"Err": ""
}
如果在此请求期间发生错误,请将错误消息添加到响应中的Err
字段。如果无错误,您可以发送空响应({}
)或Err
字段的空值。
驱动程序此时应该正在使用传入文件中传递的日志消息。如果消息未被使用,则可能会导致容器在尝试写入其 stdio 流时阻塞。
日志流消息被编码为协议缓冲区。protobuf 定义位于moby 存储库中。
由于协议缓冲区不是自限定的,您必须使用以下流格式从流中解码它们
[size][message]
其中size
是 4 字节大端序二进制编码的 uint32。在这种情况下,size
定义下一条消息的大小。message
是实际的日志条目。
流编码器/解码器的参考 golang 实现可以在此处找到。
/LogDriver.StopLogging
向插件发出信号,指示停止从定义的文件中收集日志。收到响应后,Docker 将删除该文件。在响应此请求之前,您必须确保收集流上的所有日志,否则可能会丢失日志数据。
此端点上的请求并不意味着容器已被删除,而只是它已停止。
请求
{
"File": "/path/to/file/stream"
}
响应
{
"Err": ""
}
如果在此请求期间发生错误,请将错误消息添加到响应中的Err
字段。如果无错误,您可以发送空响应({}
)或Err
字段的空值。
可选端点
日志插件可以实现两个额外的日志端点
/LogDriver.Capabilities
定义日志驱动程序的功能。必须实现此端点,Docker 才能利用任何已定义的功能。
请求
{}
响应
{
"ReadLogs": true
}
支持的功能
ReadLogs
- 这告诉 Docker 插件能够将日志读回客户端。报告支持ReadLogs
的插件必须实现/LogDriver.ReadLogs
端点
/LogDriver.ReadLogs
将日志读回客户端。当调用docker logs <container>
时使用此功能。
为了让 Docker 使用此端点,插件必须在调用/LogDriver.Capabilities
时指定。
请求
{
"ReadConfig": {},
"Info": {
"ContainerID": "123456"
}
}
ReadConfig
是读取选项的列表,它使用以下 Go 语言结构体定义
type ReadConfig struct {
Since time.Time
Tail int
Follow bool
}
Since
定义应发送的最旧日志。Tail
定义要读取的行数(例如,类似于命令tail -n 10
)Follow
信号表示客户端希望保持连接,以便在读取现有日志后接收传入的新日志消息。
Info
与/LogDriver.StartLogging
中定义的类型相同。它应该用于确定要读取的日志集。
响应
{{ log stream }}
响应应使用与插件从 Docker 消费的消息相同的格式对日志消息进行编码。