Python多文件日志配置问题:包内各文件如何共享同一Logger实例
多文件/包结构下共享自定义Logger实例的配置方案
1. 完善my_logger.py的自定义Logger实现
既然你已经子类化了Logger,直接给它加个全局单例的获取逻辑,确保整个项目所有模块拿到的是同一个实例:
import logging # 你的自定义Logger子类 class MyLogger(logging.Logger): def __init__(self, name, level=logging.DEBUG): super().__init__(name, level) # 提前定义默认日志格式(按需调整) self.default_formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) # 其他自定义行为写在这里... # 维护全局单例实例 _global_logger = None def get_my_logger(name="my_project_logger"): global _global_logger if _global_logger is None: _global_logger = MyLogger(name) return _global_logger
2. 在main.py中初始化并配置日志Handler
只在入口文件做一次Handler配置,避免重复输出:
from mypackage.my_logger import get_my_logger # 获取全局共享的Logger实例 logger = get_my_logger() # 添加FileHandler(你的原有逻辑,按需调整) file_handler = logging.FileHandler('app.log', encoding='utf-8') file_handler.setFormatter(logger.default_formatter) logger.addHandler(file_handler) logger.setLevel(logging.DEBUG) # 测试输出 logger.info("程序启动成功")
3. 在utils.py中直接使用共享Logger
不需要传递Logger实例,直接导入获取方法即可:
from mypackage.my_logger import get_my_logger # 获取全局Logger实例 logger = get_my_logger() def myfunc1(): logger.debug("执行myfunc1") # 你的函数逻辑... def myfunc2(): logger.warning("myfunc2触发警告") # 你的函数逻辑...
可选方案:利用logging的层级命名特性
如果不想用单例,也可以借助logging原生的层级继承机制:
- 在
my_logger.py中注册自定义Logger类,并创建包级根Logger:
import logging class MyLogger(logging.Logger): # 你的自定义逻辑... # 告诉logging模块使用自定义Logger类 logging.setLoggerClass(MyLogger) # 创建包级根Logger package_logger = logging.getLogger("mypackage")
main.py中配置这个包级Logger的Handler:
from mypackage.my_logger import package_logger import logging file_handler = logging.FileHandler('app.log') package_logger.addHandler(file_handler) package_logger.setLevel(logging.DEBUG)
utils.py中直接获取子级Logger,会自动继承根Logger的配置:
import logging # __name__是"mypackage.utils",属于"mypackage"的子层级 logger = logging.getLogger(__name__) def myfunc1(): logger.debug("执行myfunc1")
这种方式更符合logging的原生设计,子Logger会自动共享父Logger的Handler和级别设置。
内容的提问来源于stack exchange,提问作者Drphoton
相关产品推荐
相关产品推荐

