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

Python日志配置失败:全量日志存文件、仅DEBUG输出到控制台异常

问题分析与解决方法

你的代码核心问题是没有设置Logger本身的日志级别,logging模块的过滤逻辑是:

  1. 首先判断日志级别是否达到Logger的设置级别,没达到直接丢弃
  2. 达到后才会传递给各个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:47:03