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 %(