TGViewer
Zen of Python Zen of Python @zen_of_python · 18.8K subscribers
Post #4336 2.71K
logging | Эволюционируем от дебага с print()

Вместо хаотичного использования print() стоит освоить встроенный модуль logging.

Почему print() — не лучший выбор

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

— print() не имеет уровней важности (debug, info, error…);
— нельзя гибко управлять выводом (в файл, консоль, внешнюю систему)
— невозможно централизованно отключить или настроить поведение.

logging решает все эти задачи и стал стандартом в профессиональной разработке.

База

Минимальный пример:


import logging

logging.basicConfig(level=logging.INFO)
logging.info("Программа запущена")


Этот код выведет в консоль строку «информирующего» уровня. Метод basicConfig задает базовые настройки — например, какой минимальный уровень логов выводить. Уровней несколько:

— DEBUG: подробная отладочная информация;
— INFO: стандартный рабочий поток;
— WARNING: потенциальные проблемы;
— ERROR: ошибки, но программа продолжает работать;
— CRITICAL: фатальные ошибки, возможно аварийное завершение.

Они позволяют фильтровать отладочные данные в зависимости от задачи.

Форматирование вывода

Полезно выводить время, уровень и контекст:


logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s"
)


Выведется нечто подобное:


2025-07-07 14:00:00,123 [INFO] Программа запущена


Запись логов в файл

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


logging.basicConfig(
level=logging.INFO,
filename='app.log',
filemode='a',
format="%(asctime)s [%(levelname)s] %(message)s"
)


Обособленные логгеры

Функция getLogger(name) позволяет создавать независимые логгеры с именем:


logger = logging.getLogger("myapp")
logger.setLevel(logging.DEBUG)
logger.debug("Отладочная информация")


Такие логгеры можно конфигурировать по отдельности, что удобно в модульных проектах.

Обработчики (Handlers)

В примере ниже все сообщения уровня DEBUG и выше пишутся в файл, а WARNING+ отображаются в консоли:


handler = logging.FileHandler("debug.log")
handler.setLevel(logging.DEBUG)

console = logging.StreamHandler()
console.setLevel(logging.WARNING)

formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s")
handler.setFormatter(formatter)
console.setFormatter(formatter)

logger = logging.getLogger("myapp")
logger.addHandler(handler)
logger.addHandler(console)
logger.setLevel(logging.DEBUG)


И напоследок: пишите логи в файл или систему мониторинга вроде Sentry или Grafana.
#основы
  • ❤ 10
  • 🔥 3
  • 👌 1
More from @zen_of_python
  1. Sep 27, 2026Как запускать собственный SQL через миграции Django У models.Index нашлось необычное приме…
  2. Sep 27, 2026Как разделить синхронный и асинхронный Python-клиенты При переписывании akismet автор отка…
  3. Sep 27, 2026Как заменить цепочку isinstance на singledispatch Когда обработка типов разрастается, цепо…
  4. Sep 26, 2026Как собирать динамические фильтры Django через Q-объекты Q() представляет условие для SQL-…
  5. Sep 26, 2026Почему str.splitlines() видит больше переносов, чем чтение файла У Python два разных понят…
  6. Sep 26, 2026Как вручную разрешить ленивый импорт в Python У объекта, созданного через lazy import json…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →