Google Stackdriver未按照预期从Google Kubernetes Engine显示结构条目日志

时间:2018-10-26 13:32:56

标签: python logging kubernetes stackdriver google-cloud-stackdriver

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

当我使用Global运行脚本时,可以使用选定的资源Google Compute Engine VM instance在日志查看器中按预期方式查看日志。我正在记录的结构已正确记录在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 Log Viewer中的资源Global下看到的(日志是来自我的VM实例的日志,与我在代码片段中给出的示例不对应): enter image description here

这是我在资源Google Kubernetes Engine下看到的内容:该结构未显示,而是看到了STDOUT上打印的内容: enter image description here

1 个答案:

答案 0 :(得分:2)

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

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

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