регистрация трассировки Python только в режиме отладки - PullRequest
0 голосов
/ 23 сентября 2018

В настоящее время я загружаю регистратор Python следующим образом:

import logging
logging.basicConfig(level=logging.INFO)
log = logging.getLogger("myprogram")

и использую его, например, так:

[...]
except FileNotFoundError:
    log.exception("could not open configuration file")
    sys.exit(1)

Однако, это всегда будет печатать трассировку вместе с ошибкойсообщение:

ERROR:myprogram:could not open configuration file
Traceback (most recent call last):
[...]
FileNotFoundError: [Errno 2] No such file or directory: 
'not/existing/file.yml'

Я не хочу трассировки в нормальном выводе ошибки.Вместо этого он должен печатать только мое сообщение об ошибке и информацию об исключении («Нет такого файла ...»).

Каков рекомендуемый способ показа трассировки, только если для уровня журнала установлено значение logging.DEBUG?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Я бы использовал комбинацию exc_info и .getEffectiveLevel:

try:
    ...
except FileNotFoundError as ex:
   logger.error(ex, exc_info=log.getEffectiveLevel() == logging.DEBUG)

Таким образом, само исключение (FileNotFoundError) всегда регистрируется, ноstacktrace будет регистрироваться, только если уровень журнала отлажен.

0 голосов
/ 23 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...