首页 > 解决方案 > 通过 docker 容器扩展 filebeat

问题描述

我正在寻找适当的方法来监控由 nginx、tomcat、springboot 生成的应用程序日志,这些日志嵌入在带有 filebeat 和 ELK 的 docker 中。

在容器策略中,一个容器应该只用于一个目的。

每个容器一个 nginx,每个容器一个 tomcat,这意味着我们不能在 nginx 或 tomcat 容器中拥有额外的 filebeat。

根据我通过 Internet 阅读的内容,我们可以进行以下设置:

这很好用,但是当涉及到扩展 nginx 和 springboot 容器时,它对我来说有点复杂。

如果我有以下配置,我应该使用哪种模式使用 filebeat 将我的日志推送到 logstash:

我应该通过一组 nginx + springboot rest api 创建一个卷并添加一个 filebeat 容器吗?

我是否应该创建一个由所有容器共享的全局日志卷,并且每个容器都有不同的日志文件名(在日志的文件名中包含容器的名称?)并且只有一个 filebeat 容器?

在第二个提案中,如何扩展 filebeat ?

还有另一种方法吗?

非常感谢您的帮助。

标签: dockerelasticsearchnginx-reverse-proxyfilebeat

解决方案


如果可以管理,最简单的方法是将每个容器进程设置为记录到自己的标准输出(您可以指定/dev/stdout/proc/1/fd/1作为日志文件)。例如,Docker Hub nginx Dockerfile指定

RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log

所以普通的 nginx 日志变成了容器日志。一旦你这样做了,你可以插入filebeat 容器输入来读取这些日志并处理它们。您还可以从容器外部看到它们docker logs,它们是相同的日志。


如果您必须登录到文件系统怎么办?或者您希望能够收集多个单独的日志流?

如果容器的数量是可变的,但是您可以很好地控制它们的配置,那么我可能会按照您的描述设置一个全局日志卷,并使用filebeat 日志输入来读取该目录树中的每个日志文件。

如果容器的数量是固定的,那么您可以为每个容器设置一个卷,并将其挂载到每个容器的“常用”日志存储位置。然后将所有这些目录挂载到 filebeat 容器中。这里明显的问题是,如果您启动或停止容器,则需要重新启动添加/删除卷的日志管理器。


如果您实际上在 Kubernetes 上,还有另外两种可能性。如果您尝试从文件系统中收集容器日志,则需要在每个节点上运行 filebeat 的副本;DaemonSet 可以为你管理这个。一个 Kubernetes pod 还可以运行多个容器,因此您的另一个选择是使用应用程序容器和用于发送日志的 filebeat“sidecar”容器来设置 pod。使用卷设置 podemptyDir以保存日志,并将其挂载到两个容器中。像Helm这样的模板系统可以帮助您编写 pod 规范,而无需一遍又一遍地重复记录 sidecar 设置。


推荐阅读