Если в вашем проекте повсюду такое:
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
