You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将当前登录用户名添加至Django Server访问日志?

给Django访问日志添加登录用户名标记

我想要把当前登录的用户名(如果存在的话)添加到Django应用的访问日志中,比如在日志的这个位置:

INFO [django.server:161] "GET / HTTP/1.1" 200 116181
^ 用户名应在此处

核心问题在于:日志过滤器无法直接访问request对象,该如何在中间件与过滤器之间共享用户/用户名信息?

我已经实现了一个基于线程本地存储(thread-local)的可行方案,但这并非理想选择,而且还存在一个问题:无法在process_request中清理存储的值,因为日志打印前值就会被过早清除。

基于threading.local()的实现方案

log.py 文件内容

import logging
import threading

local = threading.local()


class LoggedInUsernameFilter(logging.Filter):
    def filter(self, record):
        user = getattr(local, 'user', None)
        if user and user.username:
            record.username = user.username
        else:
            record.username = '-'
        return True


class LoggedInUserMiddleware(object):

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        self.process_request(request)
        return self.get_response(request)

    def process_request(self, request):
        from django.contrib.auth import get_user
        user = get_user(request)
        setattr(local, 'user', user)

Django 配置文件设置

MIDDLEWARE = (
    ...
    'commons.log.LoggedInUserMiddleware',
    ...
)

...

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        ...
        'verbose_with_username': {
            'format': '[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(username)s %(message)s'
        }
    },
    'filters': {
        'logged_in_username': {
            '()': 'commons.log.LoggedInUsernameFilter',
        }
    },
    'handlers': {
        'console_with_username': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose_with_username',
            'stream': sys.stdout,
        },
    },
    'loggers': {
        ...
        'django.server': {
            'handlers': ['console_with_username'],
            'level': 'INFO',
            'propagate': False,
            'formatter': 'verbose_with_username',
            'filters': ['logged_in_username', ],
        },
        ...
    },
}

内容的提问来源于stack exchange,提问作者Emil Burzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:51:09