Docker:日志记录驱动程序的效果

时间:2017-04-19 11:52:40

标签: logging docker elastic-stack

我想使用elk堆栈(Elastic search,kibana,logstash)来记录使用docker中运行的多个微服务构建的应用程序(目前处于swram中)。

我们想要从stdout / stderr记录消息。我们的系统应该为每个开发人员添加serviceName,ContainerID,时间戳(如果可能自动和精确地执行),hostname ....而不需要为开发人员做任何工作。

Docker支持多个logging drivers,例如Json,syslog和Gelf(只有UDP),可以直接发送到logstash或通过运输系统(如logspout或其他)。

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

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

1 个答案:

答案 0 :(得分:0)

我发现Json日志只包含:{“log”:“log message”,“stream”:“stderr”,“time”:“2017-04-20T07:05:19.584571658Z”}查看使用docker inspect找到的日志文件。然而,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日志消息,因此数据包可能会丢失。但是,localhost udp包不会丢失。

将json日志发送到Logstash的Logspout会收集有关内容的其他信息并发送,因此最终结果与gelf条目没有太大区别。但是,对接器不支持Logspout,对docker的更改可能会破坏或更改功能,因为数据不在实际的json日志条目中。