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

Django使用默认与自定义日志时如何避免API场景重复日志

问题根因

你看到的第二行格式为[07/Jun/2022 09:50:14] "GET /api/v1/<path>/<uuid>/ HTTP/1.1" 200 41633的日志,不属于你自定义的my_logger输出,也不受你当前配置的LOGGING规则管控:这是Django内置的请求访问日志,开发环境下由django.server日志器输出,生产环境下由django.request日志器输出,默认会对所有请求打印一行访问记录,所以才会和你自定义的业务日志重复。
如果直接全局禁用这两个日志器,会导致Admin后台、其他非API路径的访问日志也被屏蔽,不符合需求。

实现步骤

通过请求中间件做路径级别的日志过滤,只屏蔽API路径的默认访问日志,其余路径保持原有逻辑,步骤如下:

  1. 在你的应用目录下新建中间件文件,例如api/middleware.py,写入以下代码:
import logging
from django.utils.deprecation import MiddlewareMixin

# 开发环境用django.server,生产环境替换为django.request
DJANGO_DEFAULT_LOGGER = logging.getLogger("django.server")

class FilterAPIAccessLogMiddleware(MiddlewareMixin):
    def __call__(self, request):
        # 匹配你的API路径前缀,根据实际项目的前缀修改
        if request.path.startswith("/api/"):
            # 临时提升日志级别到ERROR,屏蔽INFO级别的默认访问日志
            origin_level = DJANGO_DEFAULT_LOGGER.level
            DJANGO_DEFAULT_LOGGER.setLevel(logging.ERROR)
            
            response = self.get_response(request)
            
            # 处理完请求立刻恢复原日志级别,不影响其他非API请求
            DJANGO_DEFAULT_LOGGER.setLevel(origin_level)
            return response
        
        # 非API路径直接走原有逻辑,不修改日志配置
        return self.get_response(request)
  1. 将中间件注册到settings.py的MIDDLEWARE列表最前端,保证在所有业务逻辑前生效:
MIDDLEWARE = [
    "api.middleware.FilterAPIAccessLogMiddleware",
    "django.middleware.security.SecurityMiddleware",
    # 其余原有中间件保持不变
]
补充说明
  • 这个方案只会屏蔽API路径下INFO级别的默认访问日志,ERROR级别的服务错误日志(例如500异常、400错误)依然会正常输出,不会丢失问题排查信息。
  • 如果你是生产环境部署(用gunicorn/uwsgi而非runserver启动),只需要把代码里logging.getLogger("django.server")替换为logging.getLogger("django.request")即可,逻辑完全一致。
  • 配置完成后访问API路径将只会输出你自定义格式的业务日志,访问Admin等其他路径时默认日志仍会正常打印,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:24:23