Использование модуля регистрации python для регистрации всех исключений и ошибок

20

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

    
задан abc def foo bar 08.11.2011 в 14:01
источник
  • Возможный дубликат журналов нечетких исключений в Python –  Trevor Boyd Smith 06.04.2017 в 20:27

1 ответ

42

Вероятно, это плохая идея записать в журнал any исключение, созданное в программе, поскольку Python использует исключения также для нормального потока управления.

Поэтому вы должны регистрировать только uncaught исключения. Вы можете легко сделать это, используя exception() метод журнала , как только у вас возникнет исключение объект.

Чтобы обрабатывать все неперехваченные исключения, вы можете либо обернуть точку входа вашего сценария в блок try...except , либо путем установки специального обработчика исключений путем повторного назначения sys.excepthook() :

import logging
import sys

logger = logging.getLogger('mylogger')
# Configure logger to write to a file...

def my_handler(type, value, tb):
    logger.exception("Uncaught exception: {0}".format(str(value)))

# Install exception handler
sys.excepthook = my_handler

# Run your main script here:
if __name__ == '__main__':
    main()
    
ответ дан Ferdinand Beyer 08.11.2011 в 17:58
источник
  • Спасибо! Это именно то, что мне нужно. –  abc def foo bar 10.11.2011 в 16:55
  • Разве это не хорошая идея добавить sys .__ excepthook __ (type, value, tb) в my_handler, чтобы он мог обрабатывать действия по умолчанию для исключения? –  troyane 05.06.2014 в 17:55
  • @Ferdinand Beyer: аккуратно. Имея logger.exception («Uncaught exception: {0}: {1}». Format (str (значение .__ class __.__ name__), str (значение))) дает в моем случае ERROR - исключение для исключения: IndexError: индекс индекса из диапазон и отпечатки почему-то нет. Как мне получить полный трафик? tb кажется объектом трассировки, но traceback.print_tb (tb) также просто выплевывает None. –  bioslime 09.10.2014 в 18:09
  • @bioslime см. этот рецепт, который полагается на exc_info kwarg для регистрации трассировки. Кажется, он работает только с logger.error или logger.критическим, но не с logger.exception. –  j08lue 22.07.2016 в 10:37