从 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)