Logging.exception: примеры (PYTHON)

Использование функции exception в модуле logging Python
Раздел: Логирование, Ошибки
logging.exception(msg: object, *args, **kwargs): None

Описание функции logging.exception

Функция logging.exception предназначена для записи сообщений об ошибках с уровнем ERROR и автоматическим добавлением информации о текущем исключении. Ее используют внутри блоков except для логирования деталей исключений.

Сигнатура функции: logging.exception(msg, *args, **kwargs)

Аргументы:

  • msg - строка сообщения, может содержать спецификаторы форматирования (%s, %d).
  • *args - аргументы для подстановки в спецификаторы сообщения.
  • **kwargs - дополнительные параметры: exc_info (автоматически устанавливается в True), stack_info (добавляет информацию о стеке вызовов), extra (словарь с дополнительными данными), stacklevel (уровень для корректировки имени функции в логе).

Возвращаемое значение: отсутствует (None). Функция всегда записывает сообщение с уровнем ERROR.

Базовые примеры использования

import logging
logging.basicConfig(level=logging.DEBUG)

try:
    1 / 0
except ZeroDivisionError:
    logging.exception("Произошла ошибка деления")
ERROR:root:Произошла ошибка деления
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
try:
    int('abc')
except ValueError:
    logging.exception("Ошибка конвертации %s в число", 'abc', extra={'user': 'admin'})
ERROR:root:Ошибка конвертации abc в число
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: invalid literal for int() with base 10: 'abc'

Похожие функции в Python

  • logging.error(exc_info=True) - аналог с явным указанием параметра exc_info. Используют когда нужно контролировать уровень логирования.
  • logger.log(level, msg, exc_info=True) - запись с произвольным уровнем. Применяют для нестандартных уровней логирования.
  • sys.excepthook - глобальный обработчик исключений. Подходит для перехвата непойманных исключений.

logging.exception предпочтительнее в блоках except, так как автоматически добавляет трассировку.

Аналоги в других языках программирования

Java

try {
    int result = 1 / 0;
} catch (ArithmeticException e) {
    logger.error("Ошибка деления", e);
}

JavaScript

try {
    throw new Error('Тестовая ошибка');
} catch (error) {
    console.error('Произошла ошибка:', error);
}

C#

try {
    throw new InvalidOperationException();
}
catch (Exception ex) {
    logger.LogError(ex, "Ошибка операции");
}

Go

if err != nil {
    log.Printf("Ошибка: %v\n", err)
}

Типичные ошибки

# Ошибка: использование вне блока except
import logging
def func():
    logging.exception("Ошибка")  # Выведет 'NoneType' traceback
ERROR:root:Ошибка
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
# Ошибка: повторный вызов без исключения
try:
    1/0
except:
    exc = Exception("Кастомная ошибка")
    logging.exception(exc)  # Выведет оригинальное ZeroDivisionError

Изменения в последних версиях

В Python 3.8 добавлен параметр stacklevel для корректировки отображения места вызова в логах. В Python 3.11 улучшена производительность форматирования сообщений.

Расширенные примеры

Пример python
# Логирование в JSON формате
import logging
import json

class JsonFormatter(logging.Formatter):
    def format(self, record):
        log_record = {
            'message': record.getMessage(),
            'level': record.levelname,
            'exception': self.formatException(record.exc_info) if record.exc_info else None
        }
        return json.dumps(log_record)

logger = logging.getLogger()
handler = logging.StreamHandler()
handler.setFormatter(JsonFormatter())
logger.addHandler(handler)

try:
    raise KeyError('отсутствующий ключ')
except:
    logging.exception("JSON логирование ошибки")
{"message": "JSON логирование ошибки", "level": "ERROR", "exception": "Traceback (most recent call last):\n  File ... KeyError: 'отсутствующий ключ'"}
Пример python
# Фильтрация конфиденциальных данных
class SanitizeFilter(logging.Filter):
    def filter(self, record):
        if record.exc_info:
            record.msg = record.msg.replace('пароль123', '[скрыто]')
        return True

logging.getLogger().addFilter(SanitizeFilter())
try:
    raise Exception('Ошибка аутентификации с пароль123')
except:
    logging.exception("Служебное сообщение")

питон logging.exception function comments

En
Logging.exception Log a message with severity ERROR and exception info