Python logger регистрирует одну и ту же запись много раз

у меня есть такая функция инициализации логгера:

def generate_logger():
    import logging
    LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log")
    FORMAT = "%(asctime)s : %(message)s"
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    fh = logging.FileHandler(LOG_FILENAME)
    formatter = logging.Formatter(FORMAT)
    fh.setFormatter(formatter)
    logger.addHandler(fh)
    return logger

и в какой-то части моего кода у меня есть такое исключение:

logger = generate_logger()
except AttributeError:
    logger.error('Opps we got an error')

странно, я получаю ту же ошибку, написанную 2 раза, и ее можно предупредить только один раз, как только я изменю logger.error('Opps we got an error') С print "test", Я получаю "тест" напечатанный один раз.

что может быть проблемой и решением.

в отношении

4 ответов


вы добавляете новый файловый манипулятор в корневой регистратор каждый раз, когда вызываете эту функцию: вызов регистратора.getLogger без аргумента name возвращает один и тот же объект logger каждый раз.

вы должны вызвать generate_logger () только один раз, а затем просто получить тот же объект logger, вызвав logger.getLogger():

generate_logger()

# .... some time later

log = logger.getLogger()
except AttributeError:
   log.error('Opps we got an error')

(обратите внимание, что вам не нужно generate_logger (), чтобы вернуть значение сейчас)


Я также столкнулся с той же проблемой и наткнулся на эту страницу. Да, я также создавал несколько обработчиков. В generate_logger () вы можете проверить, есть ли другие обработчики и удалить их.

def generate_logger():
    import logging
    LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log")
    FORMAT = "%(asctime)s : %(message)s"
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    # Reset the logger.handlers if it already exists.
    if logger.handlers:
        logger.handlers = []
    fh = logging.FileHandler(LOG_FILENAME)
    formatter = logging.Formatter(FORMAT)
    fh.setFormatter(formatter)
    logger.addHandler(fh)
    return logger

Я думаю, что вы, вероятно, получаете два обработчика, добавленных к регистратору каким-то образом. Возможно, в какой-то момент добавляется неявный обработчик.


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

сколько обработчиков вы создаете? Сколько раз вы выполняете generate_logger? Каждый раз, когда вы используете generate_logger вы создадите другой обработчик для того же файла, что приведет к потенциальному дублированию.