Docker日志驱动程序插件 | Docker log driver plugins
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定义在docker仓库中。
由于协议缓冲区不是自分隔的,所以必须使用以下流格式从流中解码它们:
[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被调用时指定多少。
Since
定义应该发送的最旧日志。
Tail
定义要读取的行数(例如,像命令tail -n 10
)
Follow
表示客户希望保持连接状态,以便在读取现有日志后收到新的日志消息。
Info
是在中定义的相同类型/LogDriver.StartLogging
。它应该用于确定要读取的日志集合。
响应:
响应应该是编码的日志消息,使用与插件从Docker消耗的消息相同的格式。