Ответ
Использую многоуровневый подход к отладке и мониторингу кода на Python.
-
Логирование (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) -
Интерактивная отладка (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). -
Дополнительные инструменты:
- 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% всего процессорного времени. Потом её и оптимизируешь. Без этого можно до пенсии гадать, почему всё тормозит.
Короче, суть в чём: нельзя надеяться на один инструмент. Логи — для истории и прода, отладчик — для сложных расследований, а всякие алерты и профайлеры — чтобы спать спокойно и не бояться, что всё накроется медным тазом в три часа ночи. Комбинируй, и будет тебе счастье.