Python日志配置失败:全量日志存文件、仅DEBUG输出到控制台异常
问题分析与解决方法
你的代码核心问题是没有设置Logger本身的日志级别,logging模块的过滤逻辑是:
- 首先判断日志级别是否达到Logger的设置级别,没达到直接丢弃
- 达到后才会传递给各个Handler,再由Handler的级别二次过滤
默认情况下,Logger的级别是logging.WARNING,所以你调用的info()和debug()日志都会被Logger直接过滤,根本不会传到FileHandler和ConsoleHandler里,这就是文件空、控制台没输出的原因。
需要补充的配置
- 给Logger设置足够低的级别(比如
logging.DEBUG),确保所有需要的日志能进入Handler流程 - 你的自定义
DebugConsoleHandler逻辑没问题,但其实可以简化为普通StreamHandler并设置级别为logging.DEBUG,效果完全一致
修正后的代码
import logging import sys class DebugConsoleHandler(logging.StreamHandler): def __init__(self): super().__init__(stream = sys.stdout) def emit(self, record): if not record.levelno == logging.DEBUG: return super().emit(record) class Module1(): def __init__(self) -> None: self.logFilePath = 'logging_exp.txt' self.configureLogger() def configureLogger(self): self.logger = logging.getLogger(__name__) # 关键:设置Logger的级别为DEBUG,确保所有低级别日志能通过 self.logger.setLevel(logging.DEBUG) # log time and message to file formatter1 = logging.Formatter("%(asctime)s %(levelname)s %(message)s") file_hander = logging.FileHandler(self.logFilePath) file_hander.setLevel(logging.INFO) file_hander.setFormatter(formatter1) # log only message to console formatter2 = logging.Formatter("%(levelname)s %(message)s") console_handler = DebugConsoleHandler() console_handler.setFormatter(formatter2) self.logger.addHandler(file_hander) self.logger.addHandler(console_handler) def testLogging(self): a = 5 self.logger.info('Starting up ...') self.logger.debug('a:%s', a) m = Module1() m.testLogging()
简化版(去掉自定义Handler)
如果不想写自定义Handler,也可以用普通StreamHandler配合过滤器实现同样效果:
# 替换控制台Handler部分 console_handler = logging.StreamHandler(sys.stdout) console_handler.setFormatter(formatter2) # 添加过滤器,仅允许DEBUG级别日志通过 def debug_only_filter(record): return record.levelno == logging.DEBUG console_handler.addFilter(debug_only_filter)
内容的提问来源于stack exchange,提问作者MsA
相关产品推荐
相关产品推荐

