在 Google Kubernetes Engine 上使用 Apache Spark 进行结构化日志记录

时间:2021-07-22 18:17:46

标签: apache-spark log4j google-kubernetes-engine stackdriver google-cloud-logging

我在 Google Kubernetes Engine 集群上运行 Apache Spark 应用程序,该集群将来自 STDOUT 和 STDERR 的任何输出传播到 Cloud Logging。但是,不会传播粒度日志严重性级别。所有消息在 Cloud Logging 中都将只有 INFO 或 ERROR 严重性(取决于它是写入 stdout 还是 stderr),并且实际严重性级别隐藏在文本属性中。

我的目标是格式化 Structured Logging JSON format 中的消息,以便将严重性级别传播到 Cloud Logging。不幸的是,Apache Spark 仍然使用已弃用的 log4j 1.x 库进行日志记录,我想知道如何以 Cloud Logging 可以正确获取日志消息的方式格式化日志消息。

到目前为止,我使用的是以下默认的 log4j.properties 文件:

log4j.rootCategory=INFO, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

1 个答案:

答案 0 :(得分:1)

在 GKE 集群中启用 Cloud Logging 时,日志由 GKE 管理,因此无法像在 GCE 实例中那样轻松更改日志格式。

要在 GKE 中推送 JSON 格式的日志,您可以尝试以下选项:

  1. 使您的软件以 JSON 格式推送日志,以便 Cloud Logging 检测 JSON 格式的日志条目并以这种格式推送它们。

  2. 按照 here 中的建议管理您自己的 fluentd 版本并设置您自己的 parser,但解决方案由您管理,不再由 GKE 管理。

  3. 添加一个 sidecar 容器,用于读取您的日志并将它们转换为 JSON,然后将 JSON 转储到 stdout。 GKE 中的日志代理会将 sidecar 的日志作为 JSON 摄取。

请记住,在使用选项三时,有一些注意事项可能会导致大量资源消耗,并且您将无法使用 kubectl 日志,如here 所述。

相关问题