Google Stackdriver 未显示来自 Google Kubernetes Engine 的预期的结构条目日志

Google Stackdriver not showing struct entry log as expected from Google Kubernetes Engine

我正在为 Python 和 Python 记录器同时使用 Stackdriver Logging。我正在使用函数 google.cloud.logging.logger.log_struct (https://gcloud-python.readthedocs.io/en/latest/logging/logger.html) 将 JSON 记录到 Stackdriver。

当我使用 运行 我的脚本使用 Google Compute Engine VM instance 时,我能够使用所选资源 Global 在日志查看器中按预期查看日志。我正在记录的结构已正确记录在 jsonPayload.

但是,当日志记录来自 Google Kubernetes Engine 时,记录器视图不显示我传递的结构,而是显示 stdout 上打印的内容。我如何确保从 Google Compute Engine VM instanceGoogle Kubernetes Engine 观察到相同的行为?

这是显示我如何进行日志记录的片段:

import google.cloud.logging
import logging

logging_client = google.cloud.logging.Client()
# connects the logger to the root logging handler
cloud_logger = logging_client.logger('email_adaptor')


formatter = logging.Formatter(
            '%(asctime)s - %(levelname)s - %(message)s - %(lineno)d - %(filename)s')
# get the logger a name
logger = logging.getLogger('email_adaptor')
# set a level for the logger
logger.setLevel(logging.DEBUG)

# make the logger write on stdout
stdout_alarm_log = logging.StreamHandler(sys.stdout)
stdout_alarm_log.setFormatter(formatter)
logger.addHandler(stdout_alarm_log)


struct = {'message':'Processed Alarm', 'valid': True}
cloud_logger.log_struct(struct, severity='INFO')

logger.info(str(struct))

这是我在 VM instanceKubernetes Engine 上的 STDOUT 上获得的示例:

2018-10-26 12:30:20,008 - INFO - Processed Alarm {'valid': True} - 79 - log.py
INFO:email_adaptor:Processed Alarm {'valid': True}

这是我在 Google 日志查看器中的资源 Global 下看到的(这些日志来自我的 VM 实例,与我在代码片段中给出的示例不符):

这是我在资源 Google Kubernetes Engine 下看到的:该结构没有显示,而是我看到 STDOUT 上打印的内容:

Stackdriver 库在针对“全局”写入的代码中调用,您的 GKE 容器中的结构化日志条目将显示在“全局”资源下。

“GKE 容器”资源将显示写入 stdout 和 stderr 的日志记录,默认情况下会摄取。

要将结构化日志写入 stdout/stderr 并在 Stackdriver 中访问它们,日志记录代理将接受的唯一结构化格式是 JSON。您必须将记录器配置为输出 JSON 才能将其作为结构化日志条目提取。更多信息,请访问 https://cloud.google.com/logging/docs/agent/configuration#process-payload