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

无法将logger.ini配置加载到自定义CustomLogger类中

问题分析

你遇到的核心问题是:手动实例化自定义Logger类(CustomLogger('root'))并不会关联到logging模块通过fileConfig加载的配置。logging.config.fileConfig是用来配置logging系统中已存在的logger实例(比如通过logging.getLogger()获取的实例),而你直接new出来的CustomLogger对象是一个独立的实例,没有继承任何配置,所以getEffectiveLevel()返回0(NOTSET),调用info也不会有输出。

另外,原代码中每次实例化BaseLogger都会重复加载配置,这也是不合理的,配置应该只加载一次。

解决方案

方案1:利用logging.setLoggerClass和logging.getLogger获取配置好的自定义Logger实例

这种方式让logging模块负责创建自定义Logger实例,同时自动应用配置:

  1. 修改base_logger.py,将配置加载逻辑改为只执行一次:
import os
import logging
import logging.config

class BaseLogger(logging.Logger):
    def __init__(self, name):
        super().__init__(name)

# 确保配置只加载一次
def _setup_logging():
    config_path = os.path.join(os.path.dirname(__file__), 'logger.ini')
    logging.config.fileConfig(config_path)

# 初始化配置
_setup_logging()
  1. 修改custom_logger.py:
from .base_logger import BaseLogger

class CustomLogger(BaseLogger):
    # 无需重写__init__,除非有额外自定义逻辑
    pass
  1. 修改main.py,先设置默认Logger类为CustomLogger,再通过getLogger获取实例:
import logging
from custom_logger import CustomLogger

# 告诉logging模块,创建logger时使用CustomLogger类
logging.setLoggerClass(CustomLogger)
# 获取root logger,此时会是配置好的CustomLogger实例
logger = logging.getLogger('root')

logger.info("hello")  # 现在可以正常输出日志了

方案2:封装自定义Logger的获取方法(推荐)

这种方式将配置加载和实例获取封装在自定义类中,更简洁:

  1. 修改base_logger.py:
import os
import logging
import logging.config

class BaseLogger(logging.Logger):
    def __init__(self, name):
        super().__init__(name)

    @classmethod
    def get_instance(cls, name):
        # 检查是否已加载配置(避免重复加载)
        if not logging.getLogger().hasHandlers():
            config_path = os.path.join(os.path.dirname(__file__), 'logger.ini')
            logging.config.fileConfig(config_path)
        # 设置当前类为默认Logger类
        logging.setLoggerClass(cls)
        # 返回配置好的logger实例
        return logging.getLogger(name)
  1. 修改custom_logger.py:
from .base_logger import BaseLogger

class CustomLogger(BaseLogger):
    pass
  1. 修改main.py:
from custom_logger import CustomLogger

# 通过类方法获取配置好的实例
logger = CustomLogger.get_instance('root')
logger.info("hello")
原代码失效原因
  • 手动实例化的CustomLogger是独立对象,和logging系统中通过fileConfig配置的root logger没有关联,它没有被添加任何handlers,日志级别默认是NOTSET(0),所以不会输出日志。
  • 每次实例化BaseLogger都调用fileConfig,会重复重置logging配置,可能导致冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:55:37