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
相关产品推荐
相关产品推荐

