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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:24:03