Python 我如何拥有一个实用程序函数来交付一个现有的记录器或实例化一个新的记录器?

Python 我如何拥有一个实用程序函数来交付一个现有的记录器或实例化一个新的记录器?,python,python-3.x,logging,Python,Python 3.x,Logging,我将“get logging”函数放在一个通用帮助文件中,这样我就可以在我的应用程序中频繁调用它。我的记录器如下所示: def setupLogger(): rootLogger = logging.getLogger() rootLogger.setLevel(logging.DEBUG) formatter = logging.Formatter( "::%(levelname)s - %(message)s" ) if not ro

我将“get logging”函数放在一个通用帮助文件中,这样我就可以在我的应用程序中频繁调用它。我的记录器如下所示:

def setupLogger():
    rootLogger = logging.getLogger()
    rootLogger.setLevel(logging.DEBUG)
    formatter = logging.Formatter(
        "::%(levelname)s - %(message)s"
    )

    if not rootLogger.hasHandlers() :
        buffer = StringIO()
        bufferHandler = logging.StreamHandler(buffer)
        bufferHandler.setLevel(logging.DEBUG)
        bufferHandler.setFormatter(formatter)
        bufferHandler.set_name('buffer.logger')
        rootLogger.addHandler(bufferHandler)

        stdout_handler = logging.StreamHandler(sys.stdout)
        stdout_handler.setLevel(logging.DEBUG)
        stdout_handler.setFormatter(formatter)
        stdout_handler.set_name('stdout.logger')
        rootLogger.addHandler(stdout_handler)

    return (rootLogger, buffer)
然后,我可以从任何函数调用
util.setupLogger()
,并获得一个标准输出记录器和一个缓冲区(这样我就可以看到以前记录到控制台的内容)。然而,我需要这样做一个单例风格的函数,因为我永远不知道记录器是否已经被实例化

不幸的是,这失败了,因为每次调用setupLogger时缓冲区都没有实例化(返回null),我不能将缓冲区的初始化放在HashHandlers()函数之外(因为这会清除历史记录),而且我似乎无法从logger.StreamHandlers中撬出缓冲区以便将其交回


我觉得这比它需要的更复杂,我应该怎么做?

在处理程序中返回流怎么样

def setupLogger():
    rootLogger = logging.getLogger()
    rootLogger.setLevel(logging.DEBUG)
    formatter = logging.Formatter(
        "::%(levelname)s - %(message)s"
    )

    if not rootLogger.hasHandlers() :
        buffer = StringIO()
        bufferHandler = logging.StreamHandler(buffer)
        bufferHandler.setLevel(logging.DEBUG)
        bufferHandler.setFormatter(formatter)
        bufferHandler.set_name('buffer.logger')
        rootLogger.addHandler(bufferHandler)

        stdout_handler = logging.StreamHandler(sys.stdout)
        stdout_handler.setLevel(logging.DEBUG)
        stdout_handler.setFormatter(formatter)
        stdout_handler.set_name('stdout.logger') # BTW here I found a typo, I have fixed it.
        rootLogger.addHandler(stdout_handler)

    buffer = rootLogger.handlers[0].stream

    return rootLogger, buffer