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 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 日志查看器中的资源 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。
我正在为 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 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 日志查看器中的资源 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。