Как логировать исключения с использованием `logging.exception()`?

Для логирования исключений с помощью logging.exception(), нужно поместить этот вызов внутри блока except. logging.exception() автоматически залогирует сообщение об ошибке на уровне ERROR, а также добавит информацию о трассировке стека (stack trace) для облегчения отладки. Например:

import logging

try:
  # Код, который может вызвать исключение
  result = 1 / 0
except Exception as e:
  logging.exception("Произошла ошибка при выполнении операции.")
  # Дополнительная обработка исключения (опционально)

Метод logging.exception() - это удобный способ логировать исключения, поскольку он автоматически захватывает информацию об исключении (тип, сообщение и трассировку стека) и форматирует ее в удобочитаемый вид в логе.

Он отличается от logging.error() тем, что автоматически включает трассировку стека текущего исключения, что крайне полезно для отладки.

Вот как его можно использовать:


import logging

logging.basicConfig(level=logging.ERROR)  # Устанавливаем уровень логирования (например, ERROR)

def divide(x, y):
  try:
    result = x / y
    return result
  except ZeroDivisionError:
    logging.exception("Попытка деления на ноль!") # Логируем исключение
    return None

result = divide(10, 0)

if result is None:
  print("Ошибка при делении.")
  

Разберем пример:

  1. Импортируем модуль logging.
  2. Настраиваем базовую конфигурацию логирования с уровнем ERROR. Это означает, что будут записываться сообщения уровня ERROR, CRITICAL и более высоких уровней.
  3. В функции divide() оборачиваем операцию деления в блок try...except.
  4. В блоке except, если возникает исключение ZeroDivisionError, мы вызываем logging.exception("Попытка деления на ноль!"). Строка "Попытка деления на ноль!" станет частью сообщения в логе.
  5. logging.exception() автоматически запишет сообщение "Попытка деления на ноль!", тип исключения (ZeroDivisionError) и полную трассировку стека в лог.

Что будет записано в лог (пример):


ERROR:root:Попытка деления на ноль!
Traceback (most recent call last):
  File "<stdin>", line 4, in divide
    result = x / y
ZeroDivisionError: division by zero
  

Важные моменты:

  • Уровень логирования: Убедитесь, что уровень логирования настроен правильно (например, ERROR или DEBUG), чтобы logging.exception() действительно записывал информацию в лог.
  • Сообщение: Всегда добавляйте содержательное сообщение в logging.exception(). Это поможет вам понять контекст, в котором произошло исключение.
  • Расположение: Логируйте исключение как можно ближе к месту, где оно произошло. Это облегчит отладку.
  • Не заменяйте обработку исключений: Логирование исключения не означает, что вы обработали исключение. Вам все равно нужно предпринять соответствующие действия, например, вернуть значение по умолчанию, повторить попытку или сообщить об ошибке пользователю. logging.exception() просто записывает информацию об исключении, чтобы помочь вам отладить проблему.
  • Когда использовать logging.exception(), а когда logging.error(): Используйте logging.exception(), когда хотите записать информацию об исключении включая трассировку стека. Используйте logging.error() для других сообщений об ошибках, которые не связаны с исключением или когда вам не нужна трассировка стека.

В заключение, logging.exception() - это ценный инструмент для отладки и отслеживания ошибок в ваших Python-приложениях. Правильное его использование позволит быстро находить и устранять проблемы.

0