Asa*_*ssi 5 logging google-app-engine python-3.x google-cloud-platform stackdriver
我正在使用Google App Engine python 3.7标准,并且试图对相关的请求日志条目进行分组。根据“ 编写应用程序日志”文档,我应该:
在应用程序日志条目的LogEntry跟踪字段中设置跟踪标识符。预期的格式是项目/ [PROJECT_ID] /跟踪/ [TRACE_ID]
在哪里/如何使用LogEntry?
在为Stackdriver日志文件没有显示它是如何可能的。我想念什么吗?
代码示例将不胜感激。
[更新]按照Duck Hunt Duo的建议,我尝试了以下操作,但没有成功:
trace_id = request.headers.get('X-Cloud-Trace-Context', 'no_trace_id').split('/')[0]
client = logging.Client()
logger = client.logger('appengine.googleapis.com%2Fstdout') # Not shown
# logger = client.logger('projects/{}/logs/stdout'.format(GOOGLE_CLOUD_PROJECT)) # error
# logger = client.logger('projects/{}/logs/appengine.googleapis.com%2Fstdout'.format(GOOGLE_CLOUD_PROJECT)) # error
logger.log_text('log_message', trace=trace_id)
Run Code Online (Sandbox Code Playgroud)
该日志未出现在GAE服务日志Web控制台中
这是我的基本解决方案:
trace_id = request.headers.get('X-Cloud-Trace-Context', 'no_trace_id').split('/')[0]
trace_str = "projects/{}/traces/{}".format(os.getenv('GOOGLE_CLOUD_PROJECT'), trace_id)
log_client = logging.Client()
# This is the resource type of the log
log_name = 'stdout'
# Inside the resource, nest the required labels specific to the resource type
labels = {
'module_id': os.getenv('GAE_SERVICE'),
'project_id': os.getenv('GOOGLE_CLOUD_PROJECT'),
'version_id': os.getenv('GAE_VERSION')
}
res = Resource(type="gae_app",
labels=labels,
)
logger = log_client.logger(log_name)
logger.log_text("MESSAGE_STRING_TO_LOG", resource=res, severity='ERROR', trace=trace_str)
Run Code Online (Sandbox Code Playgroud)
它工作后,我将它包装在一个文件中,这样它的工作方式与 Google 的 python2.7 记录器类似。
这是 my_gae_logging.py:
import logging as python_logging
import os
from flask import request
from google.cloud import logging as gcp_logging
from google.cloud.logging.resource import Resource
# From GCP logging lib for Python2.7
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
_levelNames = {
CRITICAL: 'CRITICAL',
ERROR: 'ERROR',
WARNING: 'WARNING',
INFO: 'INFO',
DEBUG: 'DEBUG',
NOTSET: 'NOTSET',
'CRITICAL': CRITICAL,
'ERROR': ERROR,
'WARN': WARNING,
'WARNING': WARNING,
'INFO': INFO,
'DEBUG': DEBUG,
'NOTSET': NOTSET,
}
def get_trace_id():
trace_str = None
try:
trace_id = request.headers.get('X-Cloud-Trace-Context', 'no_trace_id').split('/')[0]
trace_str = "projects/{project_id}/traces/{trace_id}".format(
project_id=os.getenv('GOOGLE_CLOUD_PROJECT'),
trace_id=trace_id)
except:
pass
return trace_str
class Logging:
def __init__(self):
self._logger = None
@property
def logger(self):
if self._logger is not None:
return self._logger
log_client = gcp_logging.Client()
# This is the resource type of the log
log_name = 'appengine.googleapis.com%2Fstdout'
# Inside the resource, nest the required labels specific to the resource type
self._logger = log_client.logger(log_name)
return self._logger
@property
def resource(self):
resource = Resource(
type="gae_app",
labels={
'module_id': os.getenv('GAE_SERVICE'),
'project_id': os.getenv('GOOGLE_CLOUD_PROJECT'),
'version_id': os.getenv('GAE_VERSION')
}
)
return resource
def log(self, text):
text = str(text)
self.logger.log_text(text, resource=self.resource, trace=get_trace_id())
def debug(self, text):
text = str(text)
self.logger.log_text(text, resource=self.resource, severity=_levelNames.get(DEBUG), trace=get_trace_id())
def info(self, text):
text = str(text)
self.logger.log_text(text, resource=self.resource, severity=_levelNames.get(INFO), trace=get_trace_id())
def warning(self, text):
text = str(text)
self.logger.log_text(text, resource=self.resource, severity=_levelNames.get(WARNING), trace=get_trace_id())
def warn(self, text):
return self.warning(text)
def error(self, text):
text = str(text)
self.logger.log_text(text, resource=self.resource, severity=_levelNames.get(ERROR), trace=get_trace_id())
def critical(self, text):
text = str(text)
self.logger.log_text(text, resource=self.resource, severity=_levelNames.get(CRITICAL), trace=get_trace_id())
if os.getenv('GAE_VERSION'): # check if running under gcp env
logging = Logging()
else:
# when not running under gcp env, use standard python_logging
logging = python_logging
Run Code Online (Sandbox Code Playgroud)
用法:
from my_gae_logging import logging
logging.warn('this is my warning')
Run Code Online (Sandbox Code Playgroud)
您可能想看看我在这里提供的答案。
(此答案解决了如何向写入 Stackdriver 的 Cloud Functions 日志添加日志记录严重性,但基本工作流程是相同的)
引用它:
[...],您仍然可以使用 Stackdriver Logging Client Libraries创建具有一定严重性的日志。请查看此文档 以参考 Python 库,并查看此文档 以获取一些使用案例示例。
请注意,为了让日志位于正确的资源下,您必须手动配置它们,请参阅此列表 以了解支持的资源类型。此外,每种资源类型都有一些 需要出现在日志结构中的必需标签。
编辑:
使用 App Engine 的示例更新之前的答案:
from google.cloud import logging
from google.cloud.logging.resource import Resource
from flask import Flask
app = Flask(__name__)
@app.route('/')
def logger():
log_client = logging.Client()
log_name = 'appengine.googleapis.com%2Fstdout'
res = Resource( type='gae_app',
labels={
"project_id": "MY-PROJECT-ID",
"module_id": "MY-SERVICE-NAME"
})
logger = log_client.logger(log_name)
logger.log_struct({"message": "message string to log"}, resource=res, severity='ERROR') # As an example log message with a ERROR warning level
return 'Wrote logs to {}.'.format(logger.name)
Run Code Online (Sandbox Code Playgroud)
通过使用此代码作为示例,并将日志的资源类型更改为appengine.googleapis.com%2Fstdout应该有效,并将字段更改为与此处描述的标签中Resource的相同。gae_app
| 归档时间: |
|
| 查看次数: |
537 次 |
| 最近记录: |