如何解决在 Google Kubernetes Engine 上使用 Apache Spark 进行结构化日志记录
我在 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
解决方法
在 GKE 集群中启用 Cloud Logging 时,日志由 GKE 管理,因此无法像在 GCE 实例中那样轻松更改日志格式。
要在 GKE 中推送 JSON 格式的日志,您可以尝试以下选项:
-
使您的软件以 JSON 格式推送日志,以便 Cloud Logging 检测 JSON 格式的日志条目并以这种格式推送它们。
-
按照 here 中的建议管理您自己的 fluentd 版本并设置您自己的 parser,但解决方案由您管理,不再由 GKE 管理。
-
添加一个 sidecar 容器,用于读取您的日志并将它们转换为 JSON,然后将 JSON 转储到 stdout。 GKE 中的日志代理会将 sidecar 的日志作为 JSON 摄取。
请记住,在使用选项三时,有一些注意事项可能会导致大量资源消耗,并且您将无法使用 kubectl 日志,如here 所述。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。