Проблемы с ведением журнала Python из нескольких модулей

У меня есть 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 () будет пытаться создать журнал при каждом вызове. На самом деле, я немного запутался в том, что именно происходит ...

Runner.py вызывает функцию get_log в своем основном методе. Other.py вызывает get_log в глобальной области (сразу после импорта) , не в какой-либо функции)

В результате все журналы, которые я делаю, регистрируются дважды, так как обработчики создаются дважды для регистратора.

Каков самый простой способ заставить функцию get_log возвращать экземпляр того же журнала в противном случае?

6
задан Colton Phillips 7 September 2011 в 23:14
поделиться