使用下面的代码我发送错误的电子邮件。我尝试在电子邮件中包含指向云控制台日志的链接,但请求ID似乎在30%的时间内都是错误的。
如果我发现ID错误的请求,它总是几乎完全匹配,除了最后三个字符是0
(在Stackdriver控制台中)而不是101
(从env变量),总是相同的替换 - 这是云控制台的错误还是我试图使用这些ID错误?
代码(精简版):
class ErrorAlertMiddleware(object):
def process_response(self, request, response):
if response.status_code == 500:
logger.info(os.environ.get('REQUEST_LOG_ID'))
msg = 'Link to logs: https://console.cloud.google.com/logs/viewer?' + '&'.join((
'project=%s' % MY_APP_ID,
'expandAll=true',
'filters=request_id:%s' % os.environ.get('REQUEST_LOG_ID'),
'resource=gae_app',
))
# this is a utility func that simply sends email
sendemail(ERROR_RECIPIENT, msg)
return response
注意我还记录了REQUEST_LOG_ID,以确保它没有被编码或其他内容,并且日志输出与链接中显示的内容匹配
答案 0 :(得分:5)
而不是os.environ.get('REQUEST_LOG_ID')
,请使用request.environ.get('REQUEST_LOG_ID')
。
os.environ['REQUEST_LOG_ID']
可能会在当前请求的开始和您访问它的时间之间发生变化,但request.environ['REQUEST_LOG_ID']
在初始化请求后不应更改。 The docs state如果一个请求ID大于另一个请求ID,则比其他请求ID晚。这意味着Stackdriver控制台中的requestID是在电子邮件链接中生成的。这让我觉得在您访问它之前,os.environ['REQUEST_LOG_ID']
的某个地方正在从'....000'
更新到'....101'
,而request.environ['REQUEST_LOG_ID']
中的副本应该保持不变。
有关request.environ
的更多信息,请查看google.appengine.runtime.request_environment.py
中的源代码。我还没有真正找到相关文档,但该代码让我相信os.environ
不像request.environ
那样安全。