使用django_requestlogging时日志username显示为-无法获取的咨询
配置调整方案
你当前遇到日志中username字段固定输出'-'的问题,是几处配置疏漏叠加导致的,按以下优先级调整即可解决:
1. 给文件日志处理器补上请求上下文过滤器
你现有LOGGING配置中,console控制台处理器已经挂载了request过滤器,但用于写日志文件的file处理器完全没有配置这个过滤器。
这个RequestFilter的核心作用就是从绑定的请求上下文里提取username、请求IP、请求路径这些字段,注入到单条日志的结构中。没有挂载过滤器的话,就算格式串里写了%(username)s,日志记录本身也不存在这个字段,Python logging会自动用默认值'-'填充缺失字段,这也是你现在日志里该位置固定显示'-'的最直接原因。
调整后的file处理器配置:
'file': { 'level': 'INFO', 'class': 'logging.FileHandler', 'filename': 'Apple00012.log', 'formatter': 'simple', 'filters': ['request'], # 新增这一行,挂载请求上下文过滤器 }
2. 修正中间件的冗余封装与顺序问题
- 删掉你自定义的空封装
LogSetupMiddleware:你写的class LogSetupMiddleware(MiddlewareMixin, Original): pass没有任何自定义逻辑,反而可能因为Python的MRO继承顺序问题,导致组件原生的请求绑定逻辑失效。直接使用组件提供的原生中间件即可,没必要做二次空封装。 - 调整中间件在
MIDDLEWARE列表中的位置:LogSetupMiddleware必须放在django.contrib.auth.middleware.AuthenticationMiddleware的紧后方,不能放到列表靠后的位置。
原理是:AuthenticationMiddleware执行完成后,才会给request对象赋值当前登录用户信息;LogSetupMiddleware的作用就是把已经完成用户认证的请求对象绑定到线程本地,供后续的日志过滤器读取。如果位置太靠后,前置中间件(比如你项目里的UserVisitMiddleware)触发日志输出时,请求上下文还没被绑定,自然拿不到username字段。
调整后的中间件顺序参考:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', # 紧接在认证中间件后面放置请求日志组件的原生中间件 'django_requestlogging.middleware.LogSetupMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'user_visit.middleware.UserVisitMiddleware', # 删除你之前自定义封装的LogSetupMiddleware引用 ]
注意:检查整个MIDDLEWARE列表里的字符串引号,确保全部是英文半角单引号,不要用中文全角引号,否则会触发Python语法错误导致服务启动失败。
3. 修正日志格式串的实体转义问题
你当前写的simple格式串里,直接把网页转义的HTML实体"写进了Python格式字符串里,这会导致日志输出中出现无意义的实体字符,不会解析成双引号。直接用普通双引号替换即可,调整后的格式串:
'simple': { 'format': '[%(asctime)s] - %(levelname)5s - %(message)s - "%(username)s"' }
4. 后续验证注意事项
调整完成后按以下场景验证:
- 登录状态下触发接口访问,确认日志文件中username字段正确输出登录用户的用户名
- 未登录状态下访问接口,此时username默认输出'-'是组件的正常逻辑——因为匿名用户不存在对应的username字段
- 如果仍无法获取username,检查你项目的自定义用户模型,确认用户对象确实存在
username属性,而非重命名为其他字段(比如account、name)。如果项目使用异步视图,还需要注意组件默认的线程本地绑定方式无法在异步场景下获取请求上下文,需要额外适配上下文变量逻辑。
内容的提问来源于stack exchange,提问作者Shailesh
相关产品推荐
相关产品推荐

