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