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

Django应用如何设置DEBUG日志级别 自定义logger仅WARNING生效无DEBUG输出

问题原因
  • 核心原因是你自定义的logger本身没有显式设置日志级别,Python logging模块中所有非root logger的默认级别为WARNING,会直接过滤掉所有低于WARNING级别的日志,哪怕你给绑定的handler设置了DEBUG级别也不会生效。
  • 你配置的logging.basicConfig(level=logging.DEBUG)仅作用于root logger,而你给自定义logger设置了logger.propagate = False,日志不会向上传递给root logger,所以root的配置对你的自定义logger完全无效。
  • 如果是Django环境,若你的logger初始化时机早于Django日志配置的加载,Django启动时的默认日志配置也可能覆盖你之前对logger的设置。
解决方法

1. 快速修复(直接修改现有logger代码)

给你的自定义logger显式设置DEBUG级别,只需要加一行代码即可:

# Create a custom logger
logger = logging.getLogger(__name__)
logger.propagate = False
# 新增下面这行,给自定义logger本身设置级别
logger.setLevel(logging.DEBUG)
# 这行basicConfig对你的自定义logger无作用,可按需删除
logging.basicConfig(level=logging.DEBUG)

改完后重新运行,DEBUG级别的日志就可以正常输出到控制台和日志文件。

2. Django环境标准方案(推荐)

建议将自定义日志配置整合到Django的settings.py的LOGGING配置项中,避免出现加载顺序导致的配置被覆盖问题,示例配置如下:

# settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'my_console_format': {
            'format': 'myapp: %(message)s'
        },
        'my_file_format': {
            'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
        },
    },
    'handlers': {
        'my_console_handler': {
            'class': 'logging.StreamHandler',
            'formatter': 'my_console_format',
            'level': 'DEBUG',
        },
        'my_file_handler': {
            'class': 'logging.FileHandler',
            'filename': 'my_log_file.log',
            'formatter': 'my_file_format',
            'level': 'DEBUG',
        },
    },
    'loggers': {
        # 替换为你的logger.py对应的模块路径,比如logger.py在myapp目录下,就填'myapp.logger'
        'your.logger.module.path': {
            'handlers': ['my_console_handler', 'my_file_handler'],
            'level': 'DEBUG',
            'propagate': False,
        },
    },
}

配置完成后,你的logger.py可以简化为如下代码,不需要手动初始化handler和级别:

# logger.py
from pathlib import Path
import logging
import inspect

# 直接获取logger,Django会自动加载settings中的配置
logger = logging.getLogger(__name__)

def log(frame, obj):
    """Create log message and return the object."""
    path = Path(frame[0][1])
    module = path.stem
    line = frame[0][2]
    message_text = f'{obj} <{module}> {line}'
    logger.debug(message_text)
    return obj
验证方法

如果修改后仍然不生效,可以在调用logger.debug前加入如下代码排查级别设置:

# DEBUG对应数值为10,WARNING对应数值为30
print(f"Logger级别:{logger.level},实际生效级别:{logger.getEffectiveLevel()}")

如果输出的实际生效级别为30,说明你的logger级别仍然被其他配置覆盖,可排查是否有其他地方修改了该logger的配置,或者Django的LOGGING配置中disable_existing_loggers被设为了True。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:54:04