【问题标题】:Using stdout or stderr as a fluentd source?使用 stdout 或 stderr 作为 fluentd 源?
【发布时间】:2021-02-12 03:17:36
【问题描述】:
我目前在 Kubernetes 中设置了一个 php-fpm 容器,用于向 stderr 输出错误消息、异常等,我想知道如何使用该容器的输出作为 fluentd 的源/输入。
从日志文件中读取输出并使用 f.e. tail 作为输入插件,在这种情况下不是一个选项,所以我正在寻找不同的解决方案。
【问题讨论】:
-
-
因为基于12factor 应用程序应该始终直接写入stdout/stderr 而不是日志文件,所以tail 不会工作,因为它用于读取文本文件。
标签:
logging
kubernetes
stderr
fluentd
【解决方案1】:
Docker 将您的 stdout/stderr 日志写入 /var/lib/docker/containers,Kubernetes 将此目录符号链接到 /var/log/containers。
在Kubernetes世界里,访问其他容器日志的接口只有这个目录,不能直接访问它们的stdout或stderr。
查看有关部署到 Kubernetes 的 Fluentd 文档:https://docs.fluentd.org/container-deployment/kubernetes
在 DaemonSet 清单中,您可以看到 /var/log 在 Fluentd 容器内以相同的名称挂载,tail 插件用于读取此目录内的文件。
所以我说你对拥有 12 因素应用程序的担忧是完全有效的,当你将日志写入 stdout/stderr 时,Docker 会将它们写入文件,而这些文件是 Fluentd 必须用来访问的方式你的日志。所以使用tail 插件并继续。
顺便说一句,这对于 12 因素应用程序问题是可以的:
在暂存或生产部署中,每个流程的流将被执行环境捕获,与来自应用程序的所有其他流一起整理,并路由到一个或多个最终目的地以供查看和长期存档。这些归档目的地对应用程序不可见或无法配置,而是完全由执行环境管理。
也可以看看Kubernetes logging architecture。