使用ELK堆栈的最佳Docker日志logging体系结构

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

  1. 使用ELK堆栈,做日志转发的最佳方法是什么 – 我应该使用伐木工吗? 我这样问是因为我看到了工作stream,人们使用Syslog / Rsyslog将日志转发到logstash。
  2. 由于我们所有的软件都是集装箱的,我应该在所有的容器中包含Log-forwarder吗? 我打算做到这一点,因为我的大部分容器切换节点基于健康,所以我不热衷于从容器挂载到主机的文件系统。
  3. 我应该使用redis作为转发日志的代理吗? 如果是,为什么?
  4. 编写定义要转发到日志存储的日志格式的日志configuration文件有多困难?

这是一个主观的问题,但我相信这是一个很久以前人们已经解决的问题,我不想重新发明轮子。

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

  1. 发货日志 – 我们在内部使用rsyslog作为docker容器,在某些情况下使用logstash-forwarder – logstash-forwarder的优势在于它对日志进行encryption,并在某些情况下进行压缩,这一点非常重要。 我发现rsyslog是非常稳定和低资源,所以我们使用它作为默认的托运人。 对于小型机器来说,完整的logstash可能很重(关于logstash的一些更多的数据 – http://logz.io/blog/5-logstash-pitfalls-and-how-to-avoid-them/

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

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

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

HTH

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

  • 系统日志
  • fluentd
  • journald
  • GELF
  • 等等..

我build议不要将日志转发器放入每个Docker映像中。 这增加了不必要的复杂性和膨胀到你的Docker容器。 一个更简洁的解决scheme是将日志转发器(来自Elastic的最新日志转发器FileBeatreplacelogstash转发器)放入其自己的容器中,并将主机的/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.ymlconfiguration文件中,把:

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

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

这种方法很酷的一点是它允许你转发其他的主机系统日志,如果你想。 只需添加指向要转发的主机系统日志文件的另一个卷,并将该path添加到filebeat.ymlconfiguration。

我发现这个方法比其他方法(比如使用Docker日志logging驱动程序)更清洁和更灵活,因为Docker安装的其余部分保持不变。 您不必将日志logging驱动程序标志添加到每个Docker运行命令(或Docker守护进程参数)。

Interesting Posts