2015-07-09 221 views
6

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

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

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

回答

4

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

  1. 日志传送 - 我们使用rsyslog现在作为内部泊坞窗容器和logstash-转发在某些情况下 - logstash - 转发的优点是,它加密的日志,并在某些情况下,这是很重要压缩他们。我发现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/)博客 - 我说什么,我觉得是在生产

  4. 不知道你到底是努力实现与部署什么ELK正确的架构。

HTH

2

泊坞窗为2015年8月,拥有 “Logging Driver”,这样就可以出货登录到其他地方。这些是远程发布日志的支持方式。

0

我会建议不要把日志转发到各码头工人的形象。这给Docker容器增加了不必要的复杂性和膨胀。更简洁的解决方案是将日志转发器(来自Elastic的最新日志转发器FileBeat,替换logstash转发器)放入其自己的容器中,并将主机的目录作为该容器的卷挂载。

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

/var/lib/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守护程序参数)。

+1

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

相关问题