PDA

Просмотр полной версии : Как логировать ошибки в Python-скриптах


serzh
01.07.2026, 09:10
Введение

Если вы пишете на Python, рано или поздно столкнётесь с ситуацией, когда ваш скрипт выходит из строя или начинает вести себя не так, как ожидалось. Лучше узнать об этом моментально, а не спустя часы, когда уже сложно понять, что именно пошло не так. Логирование ошибок — это тот самый инструмент, который помогает вовремя ловить и анализировать косяки в коде. Для меня логирование — не просто запись сообщений в файл, а настоящий спасательный круг, когда нужно быстро найти источник проблемы и исправить её. В этой теме хочу поделиться своим опытом и практиками по грамотной организации логов в Python-проектах, чтобы облегчить себе и вам жизнь.

Что такое логирование и зачем оно нужно

Логирование — это процесс автоматической записи информации о работе программы во внешний файл или вывод в консоль. Когда речь идёт об ошибках, это обычно подробные сообщения об исключениях (exceptions) — что именно произошло, в каком месте кода и с каким стэктрейсом. Без логов разбираться в проблеме долго и муторно, особенно если ошибка появляется не всегда и не локально.

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

Основные преимущества логирования ошибок:

- Позволяет быстро находить и воспроизводить баги

- Помогает понять контекст ошибки, не запуская дебаггер

- Упрощает командную работу — каждый видит в логах, что случилось

- Сохраняет историю работы скрипта, даже если он падает

Как я организую логирование в Python

В стандартной библиотеке Python есть модуль logging, который позволяет гибко настраивать уровень, формат и место хранения логов. Я рекомендую не изобретать велосипед, а использовать именно его, чтобы не добавлять сторонние зависимости и сразу получить мощный инструмент.

Простейший пример логирования ошибки с использованием try-except:

import logging

logging.basicConfig(filename='app.log', level=logging.ERROR,
format='%(asctime)s %(levelname)s %(message)s')

try:
result = 10 / 0
except ZeroDivisionError as e:
logging.error("Возникла ошибка деления на ноль", exc_info=True)

Здесь мы настроили логирование в файл app.log только для сообщений уровня ERROR и выше. В блоке except записываем ошибку с полным стеком вызовов (exc_info=True). Так можно быстро понять, откуда взялась проблема.

Рекомендации по настройке логирования

Чтобы логирование стало действительно полезным, я советую учитывать следующие моменты:

1. Выбирайте правильный уровень логов. Для ошибок — ERROR, для предупреждений — WARNING, для отладочной информации — DEBUG и т.д. Не надо писать всё подряд на DEBUG, иначе логи превратятся в кашу.

2. Используйте удобный формат. Обычно я добавляю timestamp, уровень важности и сообщение. Можно добавить имя модуля, функцию, номер строки, чтобы быстро ориентироваться.

3. Настраивайте ротацию логов. Если лог файл слишком большой, используйте RotatingFileHandler из logging.handlers — так старые логи архивируются автоматически.

4. Для больших проектов логируйте не только ошибки, но и важные события, чтобы видеть полную картину работы.

5. По возможности выводите логи одновременно в файл и в консоль при разработке — так быстро видно, что происходит.

Пример расширенной настройки:

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

file_handler = RotatingFileHandler('my_app.log', maxBytes=1024*1024*5, backupCount=3)
file_handler.setFormatter(formatter)
file_handler.setLevel(logging.INFO)

console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
console_handler.setLevel(logging.DEBUG)

logger.addHandler(file_handler)
logger.addHandler(console_handler)

try:
1 / 0
except Exception:
logger.error("Ошибка деления", exc_info=True)

Чек-лист по логированию ошибок в Python

- [ ] Используйте стандартный модуль logging

- [ ] Настраивайте правильный уровень логирования (ERROR, WARNING, INFO, DEBUG)

- [ ] Форматируйте сообщения с датой и временем

- [ ] Логируйте полный стэктрейс (exc_info=True), чтобы быстро понять источник ошибки

- [ ] Настраивайте ротацию логов, чтобы логи не разрастались бесконтрольно

- [ ] Разделяйте логи по модулям или областям работы, если проект большой

- [ ] При разработке выводите логи и в консоль, и в файл

- [ ] Не забывайте логировать ключевые события, а не только ошибки

Типичные ошибки при логировании

1. Логировать всё подряд на уровне DEBUG без фильтрации — логи становятся нечитабельными и занимают много места.

2. Не использовать exc_info=True — тогда в лог попадает только текст ошибки без стёка вызовов, что усложняет диагностику.

3. Не настраивать ротацию логов — в итоге лог-файлы могут занять сотни мегабайт или гигабайты.

4. Делать лог-файлы недоступными для записи из-за прав — программа упадёт или пропустит запись.

5. Писать логи в корень системного диска или папки без прав, а не в специально отведённую директорию.

6. Писать логи в коде прямо в except без использования логгера, а через print() — не видно уровня и меток времени.

FAQ: Ответы на вопросы из моего опыта

— Стоит ли логировать все исключения?

Необязательно. Логируйте только те ошибки, которые реально влияют на работу программы. Если исключение плановое и обработано, обычно можно не писать его в лог.

— Можно ли использовать print вместо logging?

Для простых скриптов — да, но для серьёзной работы или деплоя print слишком примитивный и неинформативный. Лучше сразу уходить на logging.

— Как настроить логирование, чтобы одновременно видеть ошибки и в консоли, и в файле?

Используйте два обработчика (Handler) — StreamHandler для консоли и FileHandler для файла, как в примере выше.

— Надо ли логи шифровать или хранить в облаке?

Для большинства задач достаточно обычных логов на диске. Но если данные чувствительные — можно подумать о шифровании и выводе логов в централизованную систему.

— Как не потерять логи при падении программы?

Настраивайте логгеры корректно, избегайте кэширования и небольших буферов без сброса. Используйте обработку исключений с логированием, чтобы ошибки точно фиксировались.

В итоге

Не стоит недооценивать важность нормального логирования даже в самых маленьких проектах. Время, которое вы потратите на настройку, окупится многократно, когда придется искать причину странных сбоев или непонятных багов. Настроенный logging — это фундамент хорошей отладки и стабильной работы скриптов на Python. Если интересно — делитесь своим опытом и задавайте вопросы, вместе разберемся, что ещё можно улучшить!