docker - 通过 docker 容器扩展 filebeat
问题描述
我正在寻找适当的方法来监控由 nginx、tomcat、springboot 生成的应用程序日志,这些日志嵌入在带有 filebeat 和 ELK 的 docker 中。
在容器策略中,一个容器应该只用于一个目的。
每个容器一个 nginx,每个容器一个 tomcat,这意味着我们不能在 nginx 或 tomcat 容器中拥有额外的 filebeat。
根据我通过 Internet 阅读的内容,我们可以进行以下设置:
- 专用于存储日志的卷
- 一个挂载专用日志卷的 nginx 容器
- 挂载专用日志卷的 tomcat / springboot 容器
- 一个 filebeat 容器也挂载了专用的日志卷
这很好用,但是当涉及到扩展 nginx 和 springboot 容器时,它对我来说有点复杂。
如果我有以下配置,我应该使用哪种模式使用 filebeat 将我的日志推送到 logstash:
- 负载均衡中的几个 nginx 容器配置相同(日志配置相同:相同路径)
- 几个springboot rest api容器behing nginx容器具有相同的配置(日志配置相同:相同的路径)
我应该通过一组 nginx + springboot rest api 创建一个卷并添加一个 filebeat 容器吗?
我是否应该创建一个由所有容器共享的全局日志卷,并且每个容器都有不同的日志文件名(在日志的文件名中包含容器的名称?)并且只有一个 filebeat 容器?
在第二个提案中,如何扩展 filebeat ?
还有另一种方法吗?
非常感谢您的帮助。
解决方案
如果可以管理,最简单的方法是将每个容器进程设置为记录到自己的标准输出(您可以指定/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 设置。
推荐阅读
- if-statement - if 语句:条件为真,但代码块未执行
- python - 属性错误:“str”对象没有属性“str”
- apache-spark - 如何计算组中事件之间的时间
- monitoring - 除了 Azure databricks sparkUI,我如何访问实时驱动程序日志(不延迟 5 分钟)
- python - 选择 pandas groupby 中的前 n 个项目并计算平均值
- javascript - 从窗口中删除所有侦听器
- django - 仅允许电子邮件访问徽标所在的站点(Django)
- c++ - 派生类方法中的基类参数
- android - Android ADB - 无法连接到“192.168.1.4:5037”:连接被拒绝
- java - 如何重定向按钮或链接到数据库中的每个数据?- Java网络应用程序