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
相关产品推荐
相关产品推荐

