代码之家  ›  专栏  ›  技术社区  ›  Milano

无法使用中间件将用户名添加到日志记录

  •  0
  • Milano  · 技术社区  · 6 年前

    username project request 对象)。我不想补充 context

    问题是我做不到 Django 添加 请求 或者是直的 用户名 项目 LogRecord

    这是我的代码:

    import threading
    local = threading.local()
    
    class LoggingRequestMiddleware:
        def __init__(self, get_response):
            self.get_response = get_response
            # One-time configuration and initialization.
    
        def __call__(self, request):
            # Code to be executed for each request before
            # the view (and later middleware) are called.
            setattr(local, 'request', request)
            response = self.get_response(request)
    
            # Code to be executed for each request/response after
            # the view is called.
    
            return response
    

    设置.py

    def add_username_to_log(record):
    local = threading.local()
    record.username = '-'
    request = getattr(local,'request',None)
    print(request)
    
    return True
    
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'verbose': {
                'format': LOGGING_VERBOSE_FORMAT,
                'style': '{',
            },
        },
        'filters': {
            'context_filter': {
                '()': 'django.utils.log.CallbackFilter',
                'callback': add_username_to_log,
            },
    
        },
        'handlers': {
            'console': {
                'level': DEFAULT_LOG_LEVEL,
                'class': 'logging.StreamHandler',
                'formatter': 'verbose',
                'filters': ['context_filter'],
            },
            'file_main': {
                'level': DEFAULT_LOG_LEVEL,
                'class': 'logging.handlers.RotatingFileHandler',
                'filename': os.path.join(LOG_PATH, 'main.log'),
                'maxBytes': DEFAULT_LOG_SIZE,
                'formatter': 'verbose',
                'filters': ['context_filter'],
                'backupCount': 0,
            },
    
        },
        'loggers': {
            '': {
                'handlers': ['file_main'],
                'level': DEFAULT_LOG_LEVEL,
                'propagate': False,
            },
    
        },
    }
    

    但是 请求 None . 你知道为什么吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Iain Shelvington    6 年前

    threading.local() 每次都返回一个新对象,必须读写同一个对象。

    locals_a = threading.local()
    locals_a.foo = 1
    hasattr(locals_a, 'foo')  # True
    locals_b = threading.local()
    hasattr(locals_b, 'foo')  # False
    

    def add_username_to_log(record):
        from middleware import local
        request = getattr(local,'request',None)