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

时间:2015-07-09 20:53:19

标签: docker rsyslog logstash-forwarder lumberjack elastic-stack

最近我试图找出使用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文件有多难?
  5. 这是一个主观问题,但我确信这是人们很久以前解决的一个问题,我并不热衷于重新发明轮子。

3 个答案:

答案 0 :(得分:5)

好的问题和许多其他情况下的答案是 - "它取决于"。

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

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

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

  4. 不确定您到底想要实现的目标。

  5. HTH

答案 1 :(得分:2)

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

答案 2 :(得分: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守护程序参数)添加日志记录驱动程序标志。