Docker 日志驱动程序插件

本文档介绍了 Docker 的日志记录驱动程序插件。

日志记录驱动程序使用户能够将容器日志转发到另一个服务 加工。Docker 包含多个日志驱动程序作为内置驱动程序,但可以 永远不要希望通过内置驱动程序支持所有用例。插件允许 Docker 支持广泛的日志记录服务,而无需嵌入客户端 主 Docker 代码库中这些服务的库。有关更多信息,请参阅插件文档

创建日志记录插件

日志插件的主接口使用相同的 JSON+HTTP RPC 协议 通过其他插件类型。请参阅 示例插件 以获取 Logging 插件的参考实现。该示例包装了内置的日志驱动程序。jsonfilelog

LogDriver 协议

日志记录插件必须在插件激活期间注册为 。一次 已激活的用户可以将插件指定为日志驱动程序。LogDriver

日志记录插件必须实现两个 HTTP 端点:

/LogDriver.StartLogging

向插件发出容器正在启动的信号,表明插件应该启动 接收日志。

日志将通过请求中定义的文件进行流式传输。在 Linux 上,此文件 是 FIFO。Windows 目前不支持日志记录插件。

请求:

{
  "File": "/path/to/file/stream",
  "Info": {
          "ContainerID": "123456"
  }
}

File是需要使用的日志流的路径。每个 调用 都应该提供不同的文件路径,即使它是一个容器 插件已经收到了 prior 的日志。该文件由 具有随机生成名称的 Docker。StartLogging

Info是有关正在记录的容器的详细信息。这是公平的 free-form 的 free-form,但由以下结构定义定义:

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]

其中 是编码的 uint32 的 4 字节大端二进制文件。 在这种情况下 定义下一条消息的大小。 是实际的日志条目。sizesizemessage

可以在此处找到流编码器/解码器的参考 golang 实现

/LogDriver.StopLogging

向插件发出信号以停止从定义的文件收集日志。 收到响应后,Docker 将删除该文件。您必须使 确保在响应此请求或风险之前收集流上的所有日志 丢失日志数据。

此终端节点上的请求并不意味着容器已被删除 只是它已经停止了。

请求:

{
  "File": "/path/to/file/stream"
}

响应:

{
  "Err": ""
}

如果此请求期间发生错误,请向字段添加错误消息 在响应中。如果没有错误,则可以发送空响应 () 或字段的空值。Err{}Err

可选终端节点

日志插件可以实现两个额外的日志端点:

/LogDriver.Capabilities

定义日志驱动程序的功能。您必须为 Docker 能够利用任何定义的功能。

请求:

{}

响应:

{
  "ReadLogs": true
}

支持的功能:

  • ReadLogs- 这告诉 Docker 插件能够回读日志 给客户。报告其支持的插件必须实现端点ReadLogs/LogDriver.ReadLogs

/LogDriver.ReadLogs

将日志读回客户端。这在 is 时使用 叫。docker logs <container>

为了让 Docker 使用此端点,插件必须指定尽可能多的 when 被调用。/LogDriver.Capabilities

请求:

{
  "ReadConfig": {},
  "Info": {
    "ContainerID": "123456"
  }
}

ReadConfig是读取选项的列表,它由以下 golang 结构体:

type ReadConfig struct {
	Since  time.Time
	Tail   int
	Follow bool
}
  • Since定义应发送的最旧日志。
  • Tail定义要读取的行数(例如,如命令tail -n 10)
  • Follow表示客户端希望保持连接以接收新的日志消息 因为它们在读取现有日志后进入。

Info与 中定义的类型相同。应该使用 以确定要读取的日志集。/LogDriver.StartLogging

响应:

{{ log stream }}

响应应为编码的日志消息,使用与 插件从 Docker 使用的消息。