Django的django.server日志配置在Daphne下不生效怎么办
daphne下django.server日志配置不生效的定位与解决方法
核心原因拆解
- Django自带
runserver命令输出的访问日志,本身就绑定django.server日志器,所以你把该日志器级别调整为WARNING后,INFO级别的2XX响应日志会被正常过滤,配置可以生效。 - 用daphne启动服务时,你看到的格式为
127.0.0.1:33724 - - [21/Apr/2021:21:45:13] "GET /api/foo/bar" 200 455的日志,是daphne自身内置的访问日志模块直接输出的,和你在settings.py中配置的Django原生日志体系分属两套独立的日志链路,自然不会被django.server的配置规则影响。 - 你之前尝试遍历
logging.root.manager.loggerDict全局修改日志级别不生效,本质是初始化时机的问题:daphne会在加载Django配置、应用settings.py中LOGGING规则之前,就完成自身日志器的初始化和级别设置,你在Django层后续做的级别修改,会被daphne的初始化逻辑覆盖。
目标日志的对应日志器定位
- 这类访问日志的专属输出日志器名称为
daphne.access,默认日志级别为INFO,会默认输出所有状态码的请求访问日志,是2XX冗余日志的直接输出源。
可落地的调整方案
- 方案1:在Django的LOGGING配置中显式定义daphne相关日志器的级别,适配现有配置体系。参考配置片段:
配置完成后,LOGGING = { "version": 1, # 必须设为False,避免Django的日志配置禁用daphne已初始化的日志器 "disable_existing_loggers": False, "loggers": { # 保留原有django.server的WARNING级别配置 "django.server": { "level": "WARNING", }, # 新增daphne访问日志的配置 "daphne.access": { "level": "WARNING", "propagate": False, }, }, }daphne.access输出的INFO级别2XX日志会被直接过滤,不会在控制台输出。 - 方案2:通过daphne启动参数直接调整日志级别,不用改动Django配置。在启动命令中追加日志级别控制参数,直接从daphne自身的日志体系层拦截冗余日志,示例启动命令:
daphne your_project.asgi:application --log-level warning - 方案3:如果不需要daphne输出的原生访问日志,可直接在启动时禁用内置访问日志功能,后续通过自定义ASGI中间件实现请求日志的采集,完全交给Django的日志规则做统一管控。
内容的提问来源于stack exchange,提问作者tostee
相关产品推荐
相关产品推荐

