首页 > 解决方案 > 我如何拥有提供现有记录器或实例化新记录器的实用功能?

问题描述

我将我的“获取日志记录”功能放在一个通用帮助文件中,这样我就可以在我的应用程序中经常调用它。我的记录器看起来像这样:

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),我不能将缓冲区的初始化放在 hasHandlers() 函数之外(因为它会擦除历史记录),而且我似乎无法窥探从 logger.StreamHandlers 中取出缓冲区,以便我可以将其交还。

我觉得我让这变得比它需要的更复杂,我该怎么办?

标签: pythonpython-3.xlogging

解决方案


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

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

推荐阅读