来自多个模块的Python日志记录问题

来自多个模块的Python日志记录问题,python,singleton,logging,Python,Singleton,Logging,我有3个python模块 LogManager.py Runner.py Other.py Runner.py是事件链中的第一个主模块,从该模块调用Other.py中的函数 因此,在Runner.py中,我有一个对LogManager.py logger = LogManager.get_log() 从那里,我可以制作简单的日志,例如,logger.critical(“OHNOES”) 我想让get_log函数做的是类似于单例模式的事情,如果尚未设置记录器,它将设置记录器并返回它。否则,它将

我有3个python模块

LogManager.py
Runner.py
Other.py
Runner.py
是事件链中的第一个主模块,从该模块调用
Other.py
中的函数

因此,在
Runner.py
中,我有一个对
LogManager.py

logger = LogManager.get_log()
从那里,我可以制作简单的日志,例如,
logger.critical(“OHNOES”)

我想让
get_log
函数做的是类似于单例模式的事情,如果尚未设置记录器,它将设置记录器并返回它。否则,它将只返回记录器

LogManager.py的内容:

import logging

def get_log():
    logger = logging.getLogger('PyPro')
    logger.setLevel(logging.DEBUG)

    # create file handler which logs even debug messages
    fh = logging.FileHandler('pypro.log')
    fh.setLevel(logging.DEBUG)

    # create console handler with a higher log level
    ch = logging.StreamHandler()
    ch.setLevel(logging.WARNING)

    # create formatter and add it to the handlers
    fhFormatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
    chFormatter = logging.Formatter('%(levelname)s - %(filename)s - Line: %(lineno)d - %(message)s')
    fh.setFormatter(fhFormatter)
    ch.setFormatter(chFormatter)

    # add the handlers to logger
    logger.addHandler(ch)
    logger.addHandler(fh)

    logger.info("-----------------------------------")
    logger.info("Log system successfully initialised")
    logger.info("-----------------------------------")

    return logger
如您所见,LogManager.get_log()将在每次调用时尝试设置日志。真的,我有点困惑到底发生了什么

py在其main方法中调用get_log函数。 Other.py在全局范围内调用get_日志(在导入之后,而不是在任何函数中)

结果是,我创建的所有日志都记录了两次,就像为记录器创建的处理程序记录了两次一样


让get_log函数以其他方式返回同一日志的实例,我缺少的最简单的方法是什么

日志记录模块已经为您实现了单例模式-当您调用
logger.getLogger(name)
时,如果尚未创建日志记录程序,它将创建并返回它。虽然这并不是您想要的,但我建议您将
get_log()
重命名为
setup_log()
,因为它就是这样做的。然后,只需在代码开头调用一次
setup\u log()
。之后,当您实际需要记录器时,只需使用
logging.getLogger()
,它将返回已配置的记录器。

不幸的是,我一直在使用
Other.py
主函数作为验证测试,我希望能够这样做。如果我只是调用logging.getLogger(),就好像我在做上述验证测试一样,我无法完成这项工作,我不会设置日志(日志将在Runner.py中设置)