Какие инструменты отладки (pdb, logging) используешь?

Ответ

Использую многоуровневый подход к отладке и мониторингу кода на Python.

  1. Логирование (logging) – для продакшена и долгосрочного анализа. Настраиваю структурированное логирование с разными уровнями.

    import logging
    import sys
    
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    
    # Консольный handler для разработки
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setLevel(logging.INFO)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)
    
    # File handler с ротацией для прода
    from logging.handlers import RotatingFileHandler
    file_handler = RotatingFileHandler('app.log', maxBytes=10485760, backupCount=5)
    file_handler.setLevel(logging.WARNING)
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    
    logger.info("Запуск обработки батча...")
    logger.error("Не удалось подключиться к БД", exc_info=True)
  2. Интерактивная отладка (pdb/ipdb) – для локального поиска сложных багов. Предпочитаю ipdb из-за подсветки синтаксиса и автодополнения.

    def tricky_function(data):
        result = []
        for item in data:
            # Устанавливаем точку останова
            import ipdb; ipdb.set_trace()
            processed = complex_transformation(item)
            result.append(processed)
        return result

    В отладчике проверяю состояние переменных, выполняю код по шагам (n - next, s - step into).

  3. Дополнительные инструменты:

    • Sentry – для централизованного сбора и оповещения об ошибках в продакшене.
    • Декоратор @debug или print-выражения – для быстрой ad-hoc отладки простых скриптов.
    • Профилировщики (cProfile, line_profiler) – когда нужно найти узкие места по производительности, а не логические ошибки.

Ответ 18+ 🔞

Слушай, вот тебе история про то, как я обычно с кодом на Python разбираюсь, когда он начинает чудить. Тут, блядь, главное — многоуровневый подход, как в хорошем бургере: слой на слой, чтобы не развалилось всё к ебеням.

Первый слой — логирование (logging). Это для продакшена, когда уже всё запущено и ты в ус не дуешь, а оно где-то в глубине сервера тихо сдохло. Настраиваю я это дело не абы как, а с чувством, с толком, с расстановкой. Чтобы и в консоль писалось для разработки, и в файл с ротацией для долгого хранения — вдруг через месяц начальник припрется с вопросом «а почему 15-го числа в 23:47 всё накрылось?». А у тебя уже и ответ готов, потому что логи — это святое, ебать мои старые костыли.

import logging
import sys

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# Хэндлер для консоли — чтобы сразу видеть, что происходит
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)

# А это уже серьёзный хэндлер в файл, с ротацией
from logging.handlers import RotatingFileHandler
file_handler = RotatingFileHandler('app.log', maxBytes=10485760, backupCount=5)
file_handler.setLevel(logging.WARNING)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

logger.info("Запуск обработки батча...")
logger.error("Не удалось подключиться к БД", exc_info=True)

Вот смотри, exc_info=True — это вообще золотая вещь. Без него в логе будет просто «ошибка», а ты сиди и гадай, какого хуя она вылезла. А так — сразу весь стектрейс, как на ладони. Удобно, блядь.

Второй слой — интерактивная отладка (pdb/ipdb). Это когда логи уже не помогают, потому что баг настолько ебанутый, что нужно прямо в живую залезть в код и посмотреть, что там творится в момент исполнения. Я предпочитаю ipdb — он как обычный pdb, только с подсветкой и автодополнением, то есть не совсем убогий.

def tricky_function(data):
    result = []
    for item in data:
        # Ставим точку останова прямо тут и смотрим
        import ipdb; ipdb.set_trace()
        processed = complex_transformation(item)
        result.append(processed)
    return result

Запускаешь скрипт, он доходит до этой строчки — и бац, тебя выкидывает в консоль отладчика. Ты можешь смотреть переменные (item), можешь шагать по коду (n — next line, s — step into функцию), можешь даже выполнять произвольный Python. Иногда за пять минут в ipdb находишь то, над чем в логах три дня бы голову ломал. Просто волшебство, ёпта.

Ну и третий слой — это уже всякая дополнительная артиллерия, когда совсем пиздец.

  • Sentry — это вообще must-have для прода. Он как сторожевой пёс: чуть где в коде исключение вылетело — он сразу тебе в телегу или слак алерт шлёт, с полным контекстом. Доверия ебать ноль к продакшену без такого мониторинга.
  • Обычные print-ы или декоратор @debug — для быстрой, грязной отладки маленьких скриптов. Иногда проще вставить print(f"Дошёл сюда, значение X = {x}"), чем городить логи или отладчик. Главное — потом не забыть это говно удалить, а то получится пиздопроебибна в коде.
  • Профилировщики (cProfile, line_profiler) — это уже не про поиск багов, а про оптимизацию. Когда код работает, но медленно, как хуй в пальто. Запускаешь профайлер, и он тебе показывает, какая функция жрёт 95% всего процессорного времени. Потом её и оптимизируешь. Без этого можно до пенсии гадать, почему всё тормозит.

Короче, суть в чём: нельзя надеяться на один инструмент. Логи — для истории и прода, отладчик — для сложных расследований, а всякие алерты и профайлеры — чтобы спать спокойно и не бояться, что всё накроется медным тазом в три часа ночи. Комбинируй, и будет тебе счастье.