我试图在使用多种应用程序技术(Java,Rails和各种DB)的环境中集中日志logging。
我们希望开发人员使用Docker Compose调用堆栈,但是我们希望他们引用中央日志源(ELK)来debugging问题,而不是尝试将Shell打开到正在运行的Docker容器中。
应用程序全部写入文件系统,而不是写入STDOUT / STDERR,STDOUT / STDERR会删除所有与Docker日志logging驱动程序相关的选项,也会删除logspout。
我们所做的是将容器configuration为让rsyslog包含应用程序日志文件,并将其转发到具有sysloginput的logstash。 这在将日志从A移动到B的过程中起作用,但是基于sysloginput来pipe理ELK中的多技术日志是非常糟糕的(例如尝试捕获多个Java堆栈跟踪或MySQL慢速查询)。
有一个更好的方法吗? 我应该在每个容器中运行logstash,以便我可以将filter和编解码器直接应用到日志文件,这样我就不必依赖sysloginput了。
有没有办法将Docker日志logging驱动程序与写入文件系统的应用程序日志文件结合使用?
最近版本的Docker支持以“GELF”格式将日志发送到networking端口。 Logstash有一个GELFinput。 您可以在每个节点上运行Logstash,并将节点上的所有Docker实例转发给它。
作为Logstashinput: https ://www.elastic.co/guide/en/logstash/current/plugins-inputs-gelf.html
gelf { }
对于Docker输出: https : //docs.docker.com/engine/admin/logging/overview/#gelf
$ docker run -dit \ --log-driver=gelf \ --log-opt gelf-address=udp://127.0.0.1:12201 \ alpine sh
(gelf-address来自容器外部,而不是内部)
你也可以configurationlogstash来parsing默认情况下docker生成的各种json日志文件 。
另一种方法是在Kubernetes中使用所谓的边车。
他们在集群日志概念页面中提供了几个不同的例子。
你如何select应用这个概念完全取决于你的需求。
然而,一个简单的概念certificate可能会工作:
你当然也可以设置一个中央系统日志监听器(例如使用logstash或者rsyslog),并且不用边车。
这个方法也和@ Jason Martin关于使用GELF的build议非常相似。
本地边车的另一个用途可能是创build一个运行带有文件input的 logstash的容器,并暴露一个日志卷(例如/ var / log /或/ logs)。 然后,您可以与其他容器共享该卷,以允许它们写入其日志(例如/logs/$INSTANCE_ID/file.log),并使用logstashparsing它们。
这最后的设置允许监视文件,而不是STDOUT / STDERR,但你可能必须有你的日志目录chmod 1777 (或有几个这样的sidecars)。
当然,“反向”设置也会起作用(但是似乎更难pipe理/维护):让您的应用程序容器公开日志卷,并且使用logstash从头开始读取日志卷的内容。