【发布时间】:2018-06-13 04:01:08
【问题描述】:
我有一个在 Google Kubernetes Engine 上的容器中运行的简单 Python 应用。我正在尝试将标准 Python 日志记录连接到 Google Stackdriver 日志记录 using this guide。我几乎成功了,但是我得到了重复的日志条目,其中一个始终处于“错误”级别...
显示重复条目的 Stackdriver 日志屏幕截图
这是我根据上述指南设置日志记录的 python 代码:
import webapp2
from paste import httpserver
import rpc
# Imports the Google Cloud client library
import google.cloud.logging
# Instantiates a client
client = google.cloud.logging.Client()
# Connects the logger to the root logging handler; by default this captures
# all logs at INFO level and higher
client.setup_logging()
app = webapp2.WSGIApplication([('/rpc/([A-Za-z]+)', rpc.RpcHandler),], debug=True)
httpserver.serve(app, host='0.0.0.0', port='80')
这是从屏幕截图中触发日志的代码:
import logging
logging.info("INFO Entering PostEchoPost...")
logging.warning("WARNING Entering PostEchoPost...")
logging.error("ERROR Entering PostEchoPost...")
logging.critical("CRITICAL Entering PostEchoPost...")
以下是完整的 Stackdriver 日志,从屏幕截图扩展而来,错误级别解释不正确:
{
insertId: "1mk4fkaga4m63w1"
labels: {
compute.googleapis.com/resource_name: "gke-alg-microservice-default-pool-xxxxxxxxxx-ttnz"
container.googleapis.com/namespace_name: "default"
container.googleapis.com/pod_name: "esp-alg-xxxxxxxxxx-xj2p2"
container.googleapis.com/stream: "stderr"
}
logName: "projects/projectname/logs/algorithm"
receiveTimestamp: "2018-01-03T12:18:22.479058645Z"
resource: {
labels: {
cluster_name: "alg-microservice"
container_name: "alg"
instance_id: "703849119xxxxxxxxxx"
namespace_id: "default"
pod_id: "esp-alg-xxxxxxxxxx-xj2p2"
project_id: "projectname"
zone: "europe-west1-b"
}
type: "container"
}
severity: "ERROR"
textPayload: "INFO Entering PostEchoPost...
"
timestamp: "2018-01-03T12:18:20Z"
}
以下是完整的 Stackdriver 日志,从屏幕截图扩展而来,包含正确解释的 INFO 级别:
{
insertId: "1mk4fkaga4m63w0"
jsonPayload: {
message: "INFO Entering PostEchoPost..."
thread: 140348659595008
}
labels: {
compute.googleapis.com/resource_name: "gke-alg-microservi-default-pool-xxxxxxxxxx-ttnz"
container.googleapis.com/namespace_name: "default"
container.googleapis.com/pod_name: "esp-alg-xxxxxxxxxx-xj2p2"
container.googleapis.com/stream: "stderr"
}
logName: "projects/projectname/logs/algorithm"
receiveTimestamp: "2018-01-03T12:18:22.479058645Z"
resource: {
labels: {
cluster_name: "alg-microservice"
container_name: "alg"
instance_id: "703849119xxxxxxxxxx"
namespace_id: "default"
pod_id: "esp-alg-xxxxxxxxxx-xj2p2"
project_id: "projectname"
zone: "europe-west1-b"
}
type: "container"
}
severity: "INFO"
timestamp: "2018-01-03T12:18:20.260099887Z"
}
所以,这个条目可能是关键:
container.googleapis.com/stream: "stderr"
看起来除了我的日志设置工作之外,来自容器的所有日志都被发送到容器中的 stderr,我相信默认情况下,至少在 Kubernetes Container Engine 上,所有 stdout/stderr 都被选中由 Google Stackdriver 通过 FluentD 提供...话虽如此,我现在已经超出了我的理解范围。
知道为什么我会收到这些重复的条目吗?
【问题讨论】:
-
链接到的文档指出:“注意:写入 stdout 和 stderr 的日志会自动发送到 Stackdriver Logging,而无需使用 Python 的 Stackdriver Logging 库。”这意味着您需要的信息已经存在。如注释文本所示,您无需使用 Stackdriver Logging 库,并生成带有重复信息的额外日志。
-
@George 如果只有默认日志记录到 Cloud Logging 没有写出错误的日志级别,例如 WARN as ERROR。
-
我也有同样的问题。我使用下面链接的本指南来正确设置消息的严重性,但我也得到了一组严重性更高的重复项:medium.com/retailmenot-engineering/…
标签: python logging google-cloud-stackdriver google-kubernetes-engine