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

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原生的层级继承机制:

  1. 在my_logger.py中注册自定义Logger类,并创建包级根Logger:
import logging

class MyLogger(logging.Logger):
    # 你的自定义逻辑...

# 告诉logging模块使用自定义Logger类
logging.setLoggerClass(MyLogger)

# 创建包级根Logger
package_logger = logging.getLogger("mypackage")
  1. 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)
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:25:18