在线文档教程

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消耗的消息相同的格式。

示例用法插件docker文档用户指南日志记录