如何配置Django日志提升400 Bad Request错误日志的详细程度
Django 400错误日志增强配置方案
原因说明
你当前的日志只输出极简报错,是因为Django的django.request和django.security模块默认不会自动打印400错误的异常栈、请求参数、具体校验失败原因,需要单独配置开启。
调整步骤
- 第一步:先在settings.py中添加如下配置,开启DEBUG模式下的异常透传,确保错误栈能被日志捕获
DEBUG_PROPAGATE_EXCEPTIONS = True # 如果怀疑是跨域相关400,也可以临时开启下面配置排查 # CORS_ALLOW_ALL_ORIGINS = True
- 第二步:修改logging配置,补充针对Django核心模块的日志规则,同时更新格式化器输出更多上下文
调整后的完整配置如下:
logging.config.dictConfig({ 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'console': { 'format': '%(name)-12s %(levelname)-8s %(message)s 请求路径:%(path)s 状态码:%(status_code)s' }, 'file': { 'format': '%(asctime)s %(name)-12s %(levelname)-8s %(message)s 客户端IP:%(client_ip)s 请求方法:%(method)s 路径:%(path)s 状态码:%(status_code)s 异常栈:%(exc_info)s' } }, 'filters': { 'request_info': { '()': 'django.utils.log.RequestFilter' } }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'formatter': 'console', 'filters': ['request_info'] }, 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'formatter': 'file', 'filename': '/var/log/django/debug.log', 'filters': ['request_info'] } }, 'loggers': { '': { 'level': 'DEBUG', 'handlers': ['console', 'file'] }, # 单独配置Django请求和安全模块的日志,确保400错误细节被捕获 'django.request': { 'level': 'DEBUG', 'handlers': ['console', 'file'], 'propagate': False, 'exc_info': True }, 'django.security': { 'level': 'DEBUG', 'handlers': ['console', 'file'], 'propagate': False } } })
- 第三步:如果调整后还是看不到具体原因,可以临时加一个全局异常中间件,捕获所有400请求的完整参数:
在项目中新建middleware.py:
from django.http import HttpResponseBadRequest import logging logger = logging.getLogger(__name__) class BadRequestLogMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request) if response.status_code == 400: logger.error( "400错误详情", extra={ "request_body": request.body, "request_headers": dict(request.headers), "request_get": request.GET, "request_post": request.POST } ) return response
然后把这个中间件加到settings.py的MIDDLEWARE列表最顶部即可。
常见400错误排查方向
调整配置后你大概率能看到具体报错原因,常见的有:
- 请求头的
Content-Type和提交的参数格式不匹配 - CSRF token校验失败
- 提交的字段数量超过
DATA_UPLOAD_MAX_NUMBER_FIELDS限制 - 文件上传大小超过
DATA_UPLOAD_MAX_MEMORY_SIZE限制 - 请求参数存在格式错误(比如JSON格式非法)
内容的提问来源于stack exchange,提问作者michael
相关产品推荐
相关产品推荐

