GAE REQUEST_LOG_ID env变量是错误的

时间:2017-01-12 03:34:58

标签: python google-app-engine logging google-cloud-platform

使用下面的代码我发送错误的电子邮件。我尝试在电子邮件中包含指向云控制台日志的链接,但请求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,以确保它没有被编码或其他内容,并且日志输出与链接中显示的内容匹配

1 个答案:

答案 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那样安全。