如何将应用程序日志从Docker容器转发到ELK

我正在尝试将日志记录集中在使用多种应用程序技术(Java,Rails和各种DB)的环境中.

我们希望开发人员使用Docker Compose调出堆栈,但是我们希望他们引用中央日志源(ELK)来调试问题,而不是尝试打开shell来运行Docker容器.

应用程序都写入文件系统而不是STDOUT / STDERR,这将删除与Docker日志记录驱动程序和logspout相关的所有选项.

我们所做的是配置容器使rsyslog包含应用程序日志文件并将其转发到具有syslog输入的logstash.这适用于将日志从A移动到B,但基于syslog输入管理ELK中的多技术日志非常糟糕(例如,尝试捕获多Java堆栈跟踪或MySQL慢查询).

有一个更好的方法吗?我应该在每个容器中运行logstash,以便我可以直接将过滤器和编解码器应用于日志文件,这样我就不必依赖syslog输入了吗?

有没有办法将Docker日志记录驱动程序与写入文件系统的应用程序日志文件一起使用?

最佳答案
最新版本的Docker支持将“GELF”格式的日志传输到网络端口. Logstash有一个GELF输入.您可以在每个节点上运行Logstash,并让节点上的所有Docker实例转发给它.

作为Logstash输入: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来自容器外部,而不是内部)

转载注明原文:如何将应用程序日志从Docker容器转发到ELK - 代码日志