Python Logger切换为DEBUG级别后无输出,INFO正常,求排查解决
问题原因及解决方案
你的问题出在子logger的级别未显式设置:尽管你通过logging.basicConfig把root logger的级别设为了DEBUG,但你创建的logger = logging.getLogger(__name__)这个子logger默认级别是NOTSET,理论上它会继承root的级别,但在你清空root的handler后,继承机制可能出现异常,导致子logger的有效级别被默认设为INFO,从而过滤掉了DEBUG级别的日志。
解决步骤
给你的子logger显式设置DEBUG级别即可,添加一行代码:
logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 显式设置logger级别
完整修正后的代码示例
import logging logging.basicConfig(level=logging.DEBUG, filename="logging.log", filemode='w', format="%(levelname)s - %(message)s") logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 新增:显式设置logger级别 handler = logging.StreamHandler() file_handler = logging.FileHandler('logging.log') formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s") file_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s") handler.setFormatter(formatter) file_handler.setFormatter(file_formatter) logging.getLogger().handlers.clear() logger.addHandler(handler) logger.addHandler(file_handler) if __name__ == '__main__': logger.debug("App Initiated") run_ui()
额外说明
- 每个logger实例都有独立的级别过滤规则,显式设置级别可以避免继承机制带来的意外问题。
- 若希望所有子logger统一继承root的级别,需确保root的级别未被其他代码修改,同时子logger的
propagate属性保持默认的True,但显式设置子logger级别是更稳妥的做法。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

