K8s中如何处理STDOUT日志?

How to handle STDOUT logs in K8s?

在 Docker 环境中,我的 Java-App 通过 log4j 登录 STDOUT,消息将发送到 Graylog 实例。除了配置 Console-Appender 以使用 JsonLayout 之外,没有特殊的日志记录配置。

我的 docker-compose.yml 片段:

logging:
  driver: gelf
  options:
    gelf-address: "tcp://[GRAYLOG_HOST]:[PORT]"
    tag: "[...]"

那里一切正常。但是我们正在考虑把这个环境改成K8s

K8s中也会有一个Graylog实例。看起来 docker-compose.yml 日志记录设置没有 K8s 等效项。看来我必须使用某种日志记录代理,例如流利位。但是 fluent-bit 的文档看起来只能从日志文件中收集日志作为输入(以及更多),而不能从 STDOUT 中收集。

我有以下问题:

可能是我理解错了K8s中的logging原理。请随时向我解释。

Is there another possibility to read the logs directly from STDOUT and send them into Graylog?

Fluent Bit 允许数据 collection through STDIN。将您的应用程序 STDOUT 重定向到 Fluent Bit 的 STDIN,您就设置好了。

If I have to log the log messages into a log file to be read from fluent-bit: Do I have to configure log4j to do some roll-over strategies to prevent, that the log file will be bigger and bigger? I do not want to "waste" my resources "just" for logging.

在这种情况下,您可以使用 logrotate

How do you handle application logs in K8s?

三种可能的方式:

  1. 应用程序直接在外部系统(例如数据库)中输出它们的踪迹。
  2. 带有嵌入式日志记录代理的 Sidecar 容器收集应用程序跟踪并将它们发送到商店(例如数据库)。
  3. 集群范围的集中式日志记录(例如 ELK 堆栈)

我建议您使用 sidecar container 来收集日志。这可能是使用最广泛的解决方案。