В Python, как убедиться, что любые исключения регистрируются с помощью регистратора?

В приложении Python, как я могу убедиться, что все, что Stderr также идет в loggerТак что, если, например, если приложение вылетает с неперехваченным исключением, я вижу это в журнале?

Моя текущая настройка регистрации:

logger = logging.getLogger('myapp logger')
logger.setLevel(logging.INFO)
file_log_handler = logging.FileHandler('myapp.log')
logger.addHandler(file_log_handler)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_log_handler.setFormatter(formatter)
logger.addHandler(file_log_handler)

В документации по журналу Python я видел почти все, кроме как отправить stderr в файл журнала.

Я знаю, что могу перенаправить stderr в файл следующим образом:

sys.stderr = open('./myapp_errors.log', 'w')

Тем не менее, я надеюсь использовать logger регистрировать исключения, чтобы (а) форматирование было согласованным, и (б) я мог регистрировать исключения в одном и том же файле.

1 ответ

Решение

Вы можете переопределить sys.excepthook быть вашим собственным обработчиком. Затем вы можете войти в свой собственный регистратор, как считаете нужным:

import sys

def _excepthook(exctype, exc, tb):
    logger.error("An unhandled exception occurred.", exc_info=(exctype, exc, tb))

sys.excepthook = _excepthook

Фактически, стандартное поведение записи в stderr происходит от значения по умолчанию sys.excepthook,

Другие вопросы по тегам