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

Gar*_*aid 5 logstash docker docker-compose

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

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

应用程序都写入文件系统而不是 STDOUT/STDERR,这会删除与 Docker 日志驱动程序相关联的所有选项,还有日志喷口。

我们所做的是配置容器,让 rsyslog 包含应用程序日志文件,并将这些文件转发到具有 syslog 输入的 logstash。这在将日志从 A 移动到 B 方面起作用,但是基于 syslog 输入在 ELK 中管理多技术日志是可怕的(例如,试图捕获多个 Java 堆栈跟踪或 MySQL 慢查询)。

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

是否有某种方法可以将 Docker 日志驱动程序与写入文件系统的应用程序日志文件一起使用?

Jas*_*tin 2

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

作为 Logstash 输入:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-gelf.html

gelf {
}
Run Code Online (Sandbox Code Playgroud)

对于 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
Run Code Online (Sandbox Code Playgroud)

(gelf-address是从容器外部的角度来看的,而不是内部的)