8

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

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

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

4

3 回答 3

5

在许多其他情况下,好的问题和答案是 - “取决于”。

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

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

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

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

高温高压

于 2015-07-11T14:51:48.997 回答
2

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

于 2015-08-15T06:37:43.320 回答
0

我建议不要将日志转发器放入每个 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 守护程序参数)。

于 2016-03-13T18:45:01.743 回答