Docker: 日志驱动对日志的影响

Docker: effect of logging driver on logs

我想使用 elk 堆栈(Elastic 搜索、kibana、logstash)来记录在 docker(当前在 swram 中)中使用多个微服务 运行 构建的应用程序。

我们想记录来自 stdout / stderr 的消息。我们的系统应该添加 serviceName、ContainerID、时间戳(如果可能自动和精确地完成)、主机名....到每个 logentry,而不需要开发人员做任何工作。

Docker 支持多个 logging drivers,例如 Json、syslog 和 Gelf(仅 UDP),它们可以直接传送到 logstash 或通过传送系统(如 logspout 或其他) .

我的问题:日志记录驱动程序和日志传送选择如何影响日志? docker 是否总是包含以不同方式打包的相同数据(如容器 ID、时间戳、实际日志消息),或者它是否实际影响内容?

我的同事使用 logspout 从标准 docker json 日志中收集日志。如果我使用 --log-driver=gelf(假设没有丢失任何包),我是否会在 logstash 中获取完全相同的信息?

我发现 Json 日志只包含:{"log":"log message","stream":"stderr","time": "2017-04-20T07:05:19.584571658Z"} 只需查看使用 docker 检查发现的日志文件。然而,Gelf 日志有很多附加字段,如 here:

所述
fields := gelfFields{
hostname:      hostname,
containerID:   ctx.ContainerID,
containerName: string(containerName),
imageID:       ctx.ContainerImageID,
imageName:     ctx.ContainerImageName,
command:       ctx.Command(),
tag:           ctx.Config["gelf-tag"],
created:       ctx.ContainerCreated, }

不幸的是docker 只使用 udp 传输 gelf 日志消息,因此数据包可能会丢失。但是,在本地主机上的 udp 包不会丢失。

将 json 日志发送到 Logstash 的 Logspout 收集有关容器的附加信息并发送这些信息,因此最终结果与 gelf 条目没有太大区别。然而,Logspout 不是由 docker 维护的,对 docker 的更改可能会破坏或更改功能,因为数据不在实际的 json 日志条目中。