Docker:logging驱动程序对日志的影响

我想使用elk堆栈(Elastic search,kibana,logstash)来loggingDocker中运行的多个微服务(目前在swram中)构build的应用程序。

我们希望从stdout / stderr中logging消息。 我们的系统应该添加serviceName,ContainerID,时间戳(如果可能的话,自动和精确地执行),主机名….到每个logentry没有任何工作的开发人员。

Docker支持多种日志logging驱动程序 ,如Json,Syslog和Gelf(只有UDP),可以直接发送到logstash或者通过发货系统(如logspout或其他)。

我的问题:日志驱动程序和日志传送select如何影响日志? docker工人是否总是包含用不同方式打包的相同数据(如容器标识,时间戳,实际日志消息),还是实际影响内容?

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

我发现Json日志只包含:{“log”:“log message”,“stream”:“stderr”,“time”:“2017-04-20T07:05:19.584571658Z”}只需查看日志文件与docker检查发现。 然而,自己的日志有很多额外的领域,如下所述:

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维护的,并且由于数据不在实际的json日志条目中,对docker的更改可能会中断或更改function。