如何将当前登录用户名添加至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
相关产品推荐
相关产品推荐

