最近我试图找出使用ELK堆栈的最佳Docker日志记录机制。我对公司在生产中使用的最佳工作流程有一些疑问。我们的系统有典型的软件堆栈,包括Tomcat,PostgreSQL,MongoDB,Nginx,RabbitMQ,Couchbase等。截至目前,我们的堆栈在CoreOS集群中运行。请在下面找到我的问题
这是一个主观问题,但我确信这是人们很久以前解决的一个问题,我并不热衷于重新发明轮子。
答案 0 :(得分:5)
好的问题和许多其他情况下的答案是 - "它取决于"。
发货日志 - 我们在内部使用rsyslog作为docker容器,在某些情况下使用logstash-forwarder-- logstash-forwarder的优势在于它会加密日志并对其进行压缩,因此在某些情况下这很重要。我发现rsyslog非常稳定且资源很少,因此我们将其用作默认出货单。对于小型计算机,完整的logstash可能很重(有关logstash的更多数据 - http://logz.io/blog/5-logstash-pitfalls-and-how-to-avoid-them/)
我们还完全停靠并为每个rsyslog / lumberjack使用单独的Docker。易于维护,更新版本并在需要时移动。
是的,绝对使用Redis。我写了一篇关于如何构建生产ELK(http://logz.io/blog/deploy-elk-production/)的博客 - 我谈到了我认为在生产中部署ELK的正确架构
不确定您到底想要实现的目标。
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守护程序参数)添加日志记录驱动程序标志。