使用 ELK 堆栈的最佳 Docker 日志记录架构

Posted

技术标签:

【中文标题】使用 ELK 堆栈的最佳 Docker 日志记录架构【英文标题】:Best Docker logging architecture using ELK stack 【发布时间】:2015-09-28 10:47:39 【问题描述】:

最近我正在尝试使用 ELK 堆栈找出最佳的 Docker 日志记录机制。我对公司在生产中使用的最佳工作流程有一些疑问。我们的系统有典型的软件栈,包括Tomcat、PostgreSQL、MongoDB、nginx、RabbitMQ、Couchbase等。目前,我们的栈运行在CoreOS集群中。请在下面找到我的问题

    使用 ELK 堆栈,进行日志转发的最佳方法是什么 - 我应该使用 Lumberjack 吗?我问这个是因为我看到人们使用 Syslog/Rsyslog 将日志转发到 logstash 的工作流程。 既然我们所有的软件都是容器化的,我应该在我的所有容器中都包含 Log-forwarder 吗?我打算这样做,因为我的大多数容器会根据运行状况切换节点,因此我不热衷于将文件系统从容器安装到主机。 我应该使用 redis 作为代理来转发日志吗?如果是,为什么? 编写定义要转发到 log-stash 的日志格式的 log-config 文件有多难?

这是一个主观问题,但我确信这是人们早就解决的问题,我不热衷于重新发明***。

【问题讨论】:

【参考方案1】:

在许多其他情况下,好的问题和答案都是 - “视情况而定”。

    运送日志 - 我们在内部使用 rsyslog 作为 docker 容器,在某些情况下使用 logstash-forwarder - logstash-forwarder 的优势在于它会加密日志并在某些情况下压缩它们这很重要。我发现 rsyslog 非常稳定且资源较少,因此我们将其用作默认托运人。对于小型机器来说,完整的 logstash 可能很重(更多关于 logstash 的数据 - http://logz.io/blog/5-logstash-pitfalls-and-how-to-avoid-them/)

    我们还完全 docker 化,并为每个 rsyslog/lumberjack 使用单独的 Docker。易于维护、更新版本并在需要时移动。

    是的,一定要使用 Redis。我写了一篇关于如何构建生产 ELK 的博客 (http://logz.io/blog/deploy-elk-production/) - 我谈到了我认为在生产中部署 ELK 的正确架构

    不知道你到底想达到什么目的。

HTH

【讨论】:

【参考方案2】:

截至 2015 年 8 月的 Docker 具有“Logging Driver”,以便您可以将日志发送到其他地方。这些是支持的远程发送日志的方式。

系统日志 fluentd journald 凝胶 等等..

【讨论】:

【参考方案3】:

我建议不要将日志转发器放入每个 Docker 映像中。这给 Docker 容器增加了不必要的复杂性和膨胀。更简洁的解决方案是将日志转发器(来自 Elastic 的最新日志转发器是 FileBeat,它取代了 logstash 转发器)放入自己的容器中,并将主机的 /var/lib/docker 目录挂载为该容器的卷。

docker run --detach --name=docker-filebeat -v /var/lib/docker:/var/lib/docker

/var/lib/docker 包含在主机的 Docker 守护程序上运行的每个容器的所有日志。此目录中的日志文件数据与在每个容器上运行 docker logs <container_id> 获得的数据相同。

然后在filebeat.yml配置文件中,放入:

filebeat:
  prospectors:
    -
      paths:
        - /var/lib/docker/containers/*/*.log

然后配置 Filebeat 以转发到 ELK 堆栈的其余部分并启动容器。该机器上的所有 Docker 容器日志将自动转发到您的 ELK 堆栈。

这种方法很酷的地方在于,如果您愿意,它还允许您转发其他主机系统日志。只需添加另一个指向您要转发的主机系统日志文件的卷,并将该路径也添加到您的 filebeat.yml 配置中。

我发现这种方法比使用 Docker 日志记录驱动程序等其他方法更干净、更灵活,因为 Docker 设置的其余部分保持不变。您不必将日志记录驱动程序标志添加到每个 Docker 运行命令(或 Docker 守护程序参数)。

【讨论】:

这很危险,因为您最终可能会无限循环无法正确解析的 logstash 错误日志,而且在这里识别不同的日志类型也很困难

以上是关于使用 ELK 堆栈的最佳 Docker 日志记录架构的主要内容,如果未能解决你的问题,请参考以下文章

使用 ELK 堆栈进行应用程序日志记录

关于使用Spring Boot Microservices设置ELK堆栈

从 Docker 容器发送日志到 ELK 容器(没有 Filebeat)

精通springcloud:分布式日志记录和跟踪使用,ELK Stack集中日志

ELK 完整部署和使用 - 每天5分钟玩转 Docker 容器技术(90)

ELK 完整部署和使用 - 每天5分钟玩转 Docker 容器技术(90)