Зарегистрируйте исключение на уровне DEBUG
и установите exc_info=True
.logger.exception()
- это, по сути, logger.error(..., exc_info=True)
вызов, но вы можете регистрировать трассировки исключений на любом уровне:
log.debug("could not open configuration file", exc_info=True)
Это опция exc_info
, которая важна;из документации :
Если exc_info
не оценивается как ложное, это приводит к добавлению информации об исключении в сообщение регистрации.Если предоставляется кортеж исключения (в формате, возвращаемом sys.exc_info()
) или экземпляр исключения, он используется;в противном случае вызывается sys.exc_info()
для получения информации об исключении.
Возможно, вы захотите использовать печать (для stdout или stderr) для связи с конечным пользователем:
except FileNotFoundError as e:
log.debug("could not open configuration file", exc_info=True)
print("Could not open configuration file:", e.strerror, file=sys.stderr)
sys.exit(1)
Я включил системное сообщение об ошибке в вывод на печать без представления FileNotFoundError(...)
.
Если вы используете синтаксический анализатор командной строки, такой как argparse
или click
, то выполнитеиспользуйте их API обратной связи с пользователем (который обычно включает в себя также выход).
Вы можете заставить модуль ведения журнала выдавать также сообщения уровня пользователя, но если вы хотите, чтобы один вызов регистратора производил отладку,дружественные трассировки в файле и удобный вывод на консоль, вам придется настроить отдельные обработчики для этих сценариев использования с помощью обработчика консоли, используя пользовательский Formatter()
класс до , переопределяющийformatException()
метод , чтобы изменить способ отображения исключений.Просто намного проще и понятнее разделить протоколирование и взаимодействие с конечным пользователем.