TGViewer
[PYTHON:TODAY] [PYTHON:TODAY] @python2day · 63.8K subscribers
Post #8107 8.31K
🐍 Логирование в Python. Объясняем на пальцах с примерами кода.

Если в вашем проекте повсюду такое:
print("сюда дошли")
print("что-то сломалось")
print(user)

пора познакомиться со стандартным модулем logging.
Уже встроен в Python — устанавливать ничего не нужно.

🔣Самый простой вариант
import logging

logging.basicConfig(level=logging.INFO)

logging.debug("Отладочная информация")
logging.info("Приложение запущено")
logging.warning("Что-то подозрительное")
logging.error("Произошла ошибка")
logging.critical("Критическая ошибка")


В Python есть стандартные уровни логирования:
DEBUG     10
INFO 20
WARNING 30
ERROR 40
CRITICAL 50

Чем выше число — тем серьёзнее событие.
Если уровень установлен в INFO, сообщения DEBUG выводиться не будут. А если вообще ничего не настраивать, стандартный порог — WARNING.

🛠 Нормальная настройка
import logging

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

logger = logging.getLogger(__name__)

logger.info("Приложение запущено")

Получаем примерно:
2026-08-25 14:30:15,123 | INFO | __main__ | Приложение запущено

Использование
logger = logging.getLogger(__name__)

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

💾 Записываем логи в файл
logging.basicConfig(
filename="app.log",
encoding="utf-8",
level=logging.INFO,
format="%(asctime)s | %(levelname)s | %(message)s"
)

Теперь сообщения будут попадать в:
app.log

Параметр encoding у basicConfig() поддерживается начиная с Python 3.9.

🚨 Как правильно логировать исключения

Вот здесь особенно полезен:
logger.exception()

Например:
try:
result = 10 / 0
except ZeroDivisionError:
logger.exception("Не удалось выполнить вычисление")

В лог попадёт не только сообщение, но и traceback исключения.
Поэтому внутри except зачастую гораздо полезнее:
logger.exception("Ошибка обработки заказа")

чем просто:
logger.error("Ошибка")


💀 Не делайте так
logger.info(f"Пользователь {user_id} вошёл")

Для логирования переменных предпочтительнее:
logger.info("Пользователь %s вошёл", user_id)


Почему?
logging откладывает форматирование сообщения до момента, когда оно действительно понадобится. Если запись отфильтруется уровнем логирования, ненужного форматирования можно избежать.

📂 А если нужны одновременно консоль и файл?

Тут появляются Handlers:
import logging

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

formatter = logging.Formatter(
"%(asctime)s | %(levelname)s | %(name)s | %(message)s"
)

console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(formatter)

file = logging.FileHandler(
"app.log",
encoding="utf-8"
)
file.setLevel(logging.DEBUG)
file.setFormatter(formatter)

logger.addHandler(console)
logger.addHandler(file)

Получаем:
консоль
INFO
WARNING
ERROR
CRITICAL

app.log
DEBUG
INFO
WARNING
ERROR
CRITICAL

И это одна из главных возможностей logging: Logger создаёт события, Handler определяет, куда их отправлять, Formatter — как они будут выглядеть, а Filter позволяет дополнительно фильтровать записи.

Причём стандартная библиотека умеет отправлять логи не только в консоль или файл. Есть обработчики для очередей, сокетов, Syslog, SMTP и других направлений.

🧠 Запоминаем
DEBUG    → подробности для отладки
INFO → нормальная работа программы
WARNING → что-то пошло не совсем так
ERROR → операция не выполнена
CRITICAL → серьёзная проблема приложения

Для маленького скрипта иногда достаточно print().

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

И главное — для базового логирования не нужна ни одна сторонняя библиотека. Всё уже есть в стандартной библиотеке Python.

📌 Сохраняем — пригодится в проекте.

#cheatsheet #python #doc
  • 👍 43
  • 🔥 21
  • ❤ 12
  • 🫡 1
More from @python2day
  1. Sep 21, 2026🤖 Будущее наступило старик В Сан-Франциско стартап REK устроил первый публичный поединок…
  2. Sep 21, 2026⚡️ Linecast — настоящая погодная станция, карта мира и планетарий прямо в терминале. Open-…
  3. Sep 21, 2026Не отставайте от рынка — учитесь со скидкой 16% Если чувствуете, что стоите на месте, и хо…
  4. Sep 21, 2026⚡️ Нейронки бесплатно? Легко. Вышел полноценный аналог хайпового агента OpenCode, который…
  5. Sep 21, 2026😂 Ужаснее Круче формы для ввода вы точно не видели С добрым утром! 😎
  6. Sep 18, 2026🍌 Обычная ситуация на рабочем созвоне Чувак в самый ответственный момент забыл отключить…
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 →