从 Docker 容器发送日志到 ELK 容器(没有 Filebeat)

Posted

技术标签:

【中文标题】从 Docker 容器发送日志到 ELK 容器(没有 Filebeat)【英文标题】:Send logs to ELK container from Docker containers (without Filebeat) 【发布时间】:2017-01-06 02:48:31 【问题描述】:

我正在使用SEBP/ELK Docker container,因为它似乎最适合快速设置应用程序日志记录。不幸的是,在阅读完the docs 之后,似乎没有一种简单的方法可以在不使用Filebeat 的情况下从同级容器中获取日志。

我不想在我的每个容器上安装 Filebeat,因为这似乎直接违背了 Docker 的职责分离原则。

TLDR;如何从我的应用程序容器获取日志到我的 ELK 容器?

【问题讨论】:

我可能理解你的想法。我做了一个ELK镜像,你可以尝试在logstashhttps://github.com/nguoianphu/docker-elk/blob/master/logstash.conf中启用文件输入,然后你可以用docker卷挂载文件路径。 【参考方案1】:

SEBP/ELK 是解决此问题的错误工具。相反,我应该使用一个为 ELK 堆栈的每个元素创建一个容器的项目:Elasticsearch、Logstash 和 Kibana。我在 GitHub 上找到了这样一个存储库。

deviantony/docker-elk 项目将三个 ELK 元素组合成一组工作容器。这样做的好处是,与 SEBP/ELK 项目不同,deviantony/docker-elk 不会对哪些功能应该可用和哪些应该关闭持固执己见。在 SEBP/ELK 项目中,写入端口 5000 的功能被删除,当您尝试通过自定义 logstash.conf 文件将其添加回来时,UDP 侦听器最终会失败。相反,deviantony/docker-elk 项目只是有效。

加分项:该项目还有一个分支,其中包括 X-Pack,它增加了开箱即用的最低安全层。

【讨论】:

【参考方案2】:

在每个容器中使用filebeat 违背了Docker 的理念。既浪费资源,又增加管理开销。

您可以通过logstash使用本地日志文件。

示例配置:

input 
  file 
    path => "/var/log/apache.log"
    type => "apache-access"  # a type to identify those logs (will need this later)
    start_position => "beginning"
  

现在我们必须将日志文件本地化到logstash 容器:

如果你使用bind mounts,你可以在logstash容器中挂载相同的目录。

sudo docker run -d -v /path/to/logs/:/path/to/logs/in/container logstash

如果您使用volumes,您也可以将包含日志的同一卷挂载到logstash。

sudo docker run -d -v logvol:/path/to/logs/in/container logstash

【讨论】:

以上是关于从 Docker 容器发送日志到 ELK 容器(没有 Filebeat)的主要内容,如果未能解决你的问题,请参考以下文章

ELK 完整部署和使用 - 每天5分钟玩转 Docker 容器技术(90)

ELK 完整部署和使用 - 每天5分钟玩转 Docker 容器技术(90)

如何将多个 docker 容器的日志发送和聚合到日志中?

ELK 处理来自多个 docker 镜像的多行日志

用ELK工具收集rancher1.6上容器日志

利用ELK搭建Docker容器化应用日志中心