Я помещаю свою функцию «получить журнал» в общий вспомогательный файл, чтобы я мог часто вызывать ее в моем приложении. Мой регистратор выглядит так:
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, чтобы вернуть его.
Я чувствую, что делаю это более сложным, чем нужно, что мне делать?