【问题标题】:Docker: effect of logging driver on logsDocker:日志记录驱动程序对日志的影响
【发布时间】:2023-04-08 13:43:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: logging docker elastic-stack


    【解决方案1】:

    我发现 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 维护,对 docker 的更改可能会破坏或更改功能,因为数据不在实际的 json 日志条目中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多