使用Google云Stackdriver在Kubernetes引擎上记录Python代码的重复日志条目

2024-09-28 01:26:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的Python应用程序运行在googlekubernetes引擎的容器中。我正在尝试将标准Python日志记录连接到Google Stackdriver日志记录using this guide。我几乎成功了,但是我得到了重复的日志条目,其中一个总是处于“错误”级别。。。在


显示重复条目的Stackdriver日志的屏幕截图

Screenshot of Stackdriver logs showing duplicate entries

这是我的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')

下面是从屏幕截图中触发日志的代码:

^{pr2}$

以下是完整的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日志,从屏幕截图展开,具有正确解释的信息级别:

{
 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容器引擎上,所有stdout/stderr都是由Google Stackdriver通过FluentD获取的。。。话虽如此,我在这一点上有些力不从心。在

你知道为什么我会得到这些重复的条目吗?在


Tags: nameimportcomclientiddefault屏幕logging
1条回答
网友
1楼 · 发布于 2024-09-28 01:26:57

问题在于日志客户端如何初始化根记录器

    logger = logging.getLogger()
    logger.setLevel(log_level)
    logger.addHandler(handler)
    logger.addHandler(logging.StreamHandler())

除了Stackdriver处理程序之外,它还添加了默认流处理程序。 我现在的解决方法是手动初始化适当的Stackdriver处理程序:

^{pr2}$

相关问题 更多 >

    热门问题