我正在尝试将日志记录集中在使用多种应用程序技术(Java,Rails和各种DB)的环境中.
我们希望开发人员使用Docker Compose调出堆栈,但是我们希望他们引用中央日志源(ELK)来调试问题,而不是尝试打开shell来运行Docker容器.
应用程序都写入文件系统而不是STDOUT / STDERR,这将删除与Docker日志记录驱动程序和logspout相关的所有选项.
我们所做的是配置容器使rsyslog包含应用程序日志文件并将其转发到具有syslog输入的logstash.这适用于将日志从A移动到B,但基于syslog输入管理ELK中的多技术日志非常糟糕(例如,尝试捕获多Java堆栈跟踪或MySQL慢查询).
有一个更好的方法吗?我应该在每个容器中运行logstash,以便我可以直接将过滤器和编解码器应用于日志文件,这样我就不必依赖syslog输入了吗?
最佳答案
最新版本的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来自容器外部,而不是内部)