собственный Logger не регистрирует Exception, но root logger делает

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

Я создал file_handler, который должен регистрировать все и email_handler для критических проблем. Обработчики работают, кроме перехвата неожиданных ошибок. Я попытался записать все с помощью корневого регистратора, который имеет ту же конфигурацию, что и file_handler, который работает. Почему мой file_handler не ловит неожиданные ошибки?

Вот мой код:

# root logger
logging.basicConfig(filename='flask.log', level=logging.WARNING)

# own logger
logger = logging.getLogger('flask')
file_handler = logging.handlers.TimedRotatingFileHandler('flask.log', when='D', interval=1)
email_handler = SMTPHandler(...)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger.setLevel(logging.DEBUG)
file_handler.setLevel(logging.DEBUG)
email_handler.setLevel(logging.WARNING)
file_handler.setFormatter(formatter)
email_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.addHandler(email_handler)

Если у меня есть ошибка в функции (например, класс A не имеет атрибута X), неожиданная проблема регистрируется только корневым регистратором.

Всего 1 ответ


Временное решение:

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

Код обходного пути:

# own logger
logger = logging.getLogger() # no name -> logger = root logger
file_handler = logging.handlers.TimedRotatingFileHandler('flask.log', when='D', interval=1)
email_handler = SMTPHandler(...)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger.setLevel(logging.DEBUG)
file_handler.setLevel(logging.DEBUG)
email_handler.setLevel(logging.WARNING)
file_handler.setFormatter(formatter)
email_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.addHandler(email_handler)

Есть идеи?

10000