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

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

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

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

在每个容器中使用filebeat都违反了Docker的理念。 这将是资源的浪费,并有更多的pipe理开销。

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

configuration示例:

 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 

SEBP / ELK是解决这个问题的错误工具。 相反,我应该使用一个项目来为ELK堆栈的每个元素(Elasticsearch,Logstash和Kibana)分配一个容器。 我在GitHub上find了这样一个仓库。

deviantony / docker-elk项目将三个ELK元素组合成一组工作的容器。 与SEBP / ELK项目不同的是,Deviantony / docker-elk并没有就应该提供哪些function以及应该closures哪些function持有自己的观点。 在SEBP / ELK项目中,写入端口5000的function将被删除,当您尝试通过自定义logstash.conf文件将其添加回来时,UDP侦听程序最终会失败。 相反,deviantony / docker-elk项目正常工作。

奖励要点:这个项目也有一个分支,其中包括X-Pack,它增加了一个最小的安全层。