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

Python日志继承问题:自定义日志配置后无日志输出排查

问题

我正在开发一个核心工具包,需要设置一些日志属性(我知道这不是最佳实践,但用于内部日志生成)。导入该包后却没有日志输出:

# core.__main__.py

class BaseLoggerConfig(BaseModel):

    LOG_FORMAT: str = "%(levelprefix)s %(asctime)s  %(name)s:%(lineno)d: %(message)s"
    DATEFMT: str = "%Y-%m-%d %H:%M:%S"

    LOG_LEVEL: int = logging.INFO

    version: int = 1
    disable_existing_loggers: bool = False
    formatters: dict = {
        "default": {
            # "()": "uvicorn.logging.DefaultFormatter",
            "fmt": LOG_FORMAT,
            "datefmt": DATEFMT,
        },
    }
    filters: dict = {}

    handlers: dict = {
        "default": {
            "formatter": "default",
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stderr",
        }
    }

    loggers: dict = {}

    def __init__(self, name: str, **data):
        super().__init__(**data)

        self.loggers[name] = {
            "handlers": ["default"],
            "level": self.LOG_LEVEL,
            "propagate": False,
        }

LOG_CONFIG = BaseLoggerConfig(__name__)

logging.config.dictConfig(LOG_CONFIG)

当前日志配置的输出:

- core.__main__
  Level: INFO
  Handlers: ['StreamHandler']

我的其他文件中包含日志代码,例如:

# core.utils
import logging

logger = logging.getLogger(__name__)

def test():
    logger.info(f"I am a log from {__name__}")
# test.py
import logging
from core.utils import test

logger = logging.getLogger(__name__)

test()

请问我遗漏了什么?


解答

问题出在你只给core.__main__这个特定的logger配置了处理器,而core.utils的logger并没有被配置,同时因为你设置了propagate: False,它的日志不会向上传播到未配置的父logger(比如core或根logger),所以日志无法输出。

解决方案1:配置整个core包的logger

修改BaseLoggerConfig的__init__方法,将配置应用到core包的根logger(即core),这样所有core子模块的logger都会继承这个配置:

def __init__(self, name: str, **data):
    super().__init__(**data)
    # 提取包根名称(比如从core.__main__得到core)
    root_package = name.split('.')[0]
    self.loggers[root_package] = {
        "handlers": ["default"],
        "level": self.LOG_LEVEL,
        "propagate": False,
    }

解决方案2:配置根logger

如果希望所有未单独配置的logger都能输出日志,可以直接配置根logger(用空字符串''作为logger名称):

def __init__(self, name: str, **data):
    super().__init__(**data)
    self.loggers[''] = {  # 根logger
        "handlers": ["default"],
        "level": self.LOG_LEVEL,
        "propagate": False,
    }

解决方案3:允许日志向上传播

如果你想保留当前针对core.__main__的配置,同时让其他子模块的日志能传播到父级,可以修改子logger的propagate为True,或者确保父logger(比如core)有配置。不过这种方式不如前两种灵活,适合特定场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:13:12