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

Django日志过滤器仅启动时生效,HTTP请求时未触发的问题求助

解决Django静态资源GET请求日志过滤失效问题

问题原因

你遇到的问题是因为Django的HTTP请求日志(比如GET /static/这类)由django.server专用logger输出,它默认有独立的日志配置,不会继承root logger的handler过滤规则,所以你之前配置的过滤器只会作用在root logger覆盖的日志上,对HTTP请求日志无效。

解决方案

需要在LOGGING配置中显式指定django.server logger使用带过滤器的handler,同时优化回调函数的日志消息获取逻辑,避免格式兼容问题。

修改后的完整配置

  1. 调整settings.py中的LOGGING配置
def do_skip_static_media(record):
    # 仅用于调试
    import sys
    sys.stderr.write(f">>>do_skip_static_media:{repr(record)}\n")

    msg = record.getMessage()
    if msg.startswith("GET /debughistory_sidebar/") or msg.startswith("GET /static/"):
        return False
    return True

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "filters": {
        'skip_static_media': {
            '()': 'django.utils.log.CallbackFilter',
            'callback': do_skip_static_media
        }
    },
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "filters": ['skip_static_media'],
        },
    },
    "root": {
        "handlers": ["console"],
        "level": "WARNING",
    },
    "loggers": {
        # 显式配置django.server logger使用带过滤器的console handler
        "django.server": {
            "handlers": ["console"],
            "level": "INFO",
            "propagate": False,  # 禁止向上传播,避免重复日志
        },
    },
}

关键修改说明

  • 添加django.server logger配置:指定它使用我们定义的console handler,这样HTTP请求日志会经过过滤器处理。设置propagate: False是为了避免日志同时被root logger和django.server logger重复输出。
  • 优化日志消息获取:改用record.getMessage()代替record.args[0],这个方法会自动处理日志的格式化参数,能更可靠地获取完整的日志内容,避免因日志格式差异导致的判断失效。

验证

重启Django服务后,再访问静态资源或目标路径,对应的GET请求日志就会被过滤掉,过滤器会在每次HTTP请求时触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:35:00