我同时使用Python的Stackdriver Logging和Python记录器。我正在使用函数google.cloud.logging.logger.log_struct
(https://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 instance
和Google 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 instance
和Kubernetes 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实例的日志,与我在代码片段中给出的示例不对应):
这是我在资源Google Kubernetes Engine
下看到的内容:该结构未显示,而是看到了STDOUT
上打印的内容:
答案 0 :(得分:2)
Stackdriver库调用针对“全局”的代码写入,来自GKE容器的结构化日志条目将显示在“全局”资源下。
“ GKE容器”资源将显示写入stdout和stderr的日志,默认情况下会提取这些日志。
要将结构化日志写入stdout / stderr并在Stackdriver中访问它们,日志记录代理将接受的唯一结构化格式是JSON。您必须将记录器配置为输出JSON,以便将其作为结构化日志条目提取。有关更多信息,请访问https://cloud.google.com/logging/docs/agent/configuration#process-payload。