给Django日志加上request_id

来源:互联网 发布:php forreach 编辑:程序博客网 时间:2024/05/16 16:02

用来标识同一个请求的日志,方便检索和分析。

request_id用uuid自动生成。如果请求头有X-Request-ID,就用请求头的,这样一个请求涉及多个服务调用的时候可以把request_id带过去,标识为同一个请求的request_id.

下面是代码示例。

在一个文件中自定义Middleware和Logging Filter.

import loggingimport threadingimport uuidfrom django.utils.deprecation import MiddlewareMixinlocal = threading.local()class RequestIDFilter(logging.Filter):    def filter(self, record):        record.request_id = getattr(local, 'request_id', "none")        return Trueclass RequestIDMiddleware(MiddlewareMixin):    def process_request(self, request):        local.request_id = request.META.get('HTTP_X_REQUEST_ID', uuid.uuid4().hex)    def process_response(self, request, response):        if hasattr(request, 'request_id'):            response['X-Request-ID'] = local.request_id        try:            del local.request_id        except AttributeError:            pass        return response

然后在settings.py中引用.
LOGGING配置示例

LOGGING = {    'filters': {        'request_id': {  # 自定义的filter            '()': 'xxx.middlewares.RequestIDFilter'        }    },    'formatters': {        'standard': {            'format': '%(levelname)s [%(asctime)s] [%(request_id)s] %(name)s: %(message)s'  # 这里使用filter request_id里的request_id字段        },    },    'handlers': {        'console': {            'level': 'DEBUG',            'class': 'logging.StreamHandler',            'filters': ['request_id'],  # 这里使用上面的filter: request_id            'formatter': 'standard',  # 这里使用上面的formatter: standard        },    },    'loggers': {        'xxx': {            'handlers': ['console'],  # 这里使用上面的handler: console            'level': 'DEBUG',            'propagate': False,        },    }}

ok, 现在代码里用logging打的日志就会带上request_id了.

原创粉丝点击