Как мне получить служебную функцию, которая либо предоставляет существующий регистратор, либо создает новый? - PullRequest
1 голос
/ 29 мая 2020

Я помещаю свою функцию «получить журнал» в общий вспомогательный файл, чтобы я мог часто вызывать ее в моем приложении. Мой регистратор выглядит так:

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() из любой функции и получить как регистратор stdout, так и буфер (чтобы я мог видеть, что было зарегистрировано ранее на консоли). Однако мне нужно выполнить такую ​​функцию в стиле singleton, потому что я никогда не знаю, был ли уже создан экземпляр регистратора.

К сожалению, это не удается, потому что буфер не создается при каждом вызове setupLogger (возвращает null), не могу поместить инициализацию буфера ВНЕ функции hasHandlers () (потому что это стирает историю), и я не могу извлечь буфер из logger.StreamHandlers, чтобы вернуть его.

Я чувствую, что делаю это более сложным, чем нужно, что мне делать?

1 Ответ

1 голос
/ 29 мая 2020

Как насчет возврата потока внутри обработчика?

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
...