如何解决openstack中协程切换后request_id打印不对或者不打印的问题的

OpenStack各组件一般都对外提供REST服务,当某个API请求过来之后,由于可能会涉及多个方法和进程的处理,为了方便的跟踪这个请求和后续通过日志定位,我们需要有个唯一标示来追踪这个请求,这样就能从大量日志信息中找到和这个请求相关的日志了。

OpenStack是有这个能力跟踪某个API请求的,在M版本中是通过oslo_middleware中的request_id这个中间件来实现的

[filter:request_id]
paste.filter_factory = oslo_middleware:RequestId.factory
看一下这个中间件的实现:
ENV_REQUEST_ID = 'openstack.request_id'
HTTP_RESP_HEADER_REQUEST_ID = 'x-openstack-request-id'


class RequestId(base.ConfigurableMiddleware):
    """Middleware that ensures request ID.

    It ensures to assign request ID for each API request and set it to
    request environment. The request ID is also added to API response.
    """

    @webob.dec.wsgify
    def __call__(self, req):
        req_id = context.generate_request_id()
        req.environ[ENV_REQUEST_ID] = req_id
        response = req.get_response(self.application)
        if HTTP_RESP_HEADER_REQUEST_ID not in response.headers:
            response.headers.add(HTTP_RESP_HEADER_REQUEST_ID, req_id)
        return response
可以发现一旦有API请求经过这个中间件,他就会在req环境变量中随机生成一个uuid的标示,用来记录这个请求,这个请求标示是可以打印到日志里面的,只需要在我们的日志配置项中加上request_id这个配置项即可,具体的来讲是在logging_context_format_string 中加上request_id,这样日志里面就能打印出request_id了。

logging_context_format_string=%(asctime)s [%(threadName)s %(processName)s][%(filename)s %(
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值