Логирование в Python
Структурированный способ с уровнями важности, которым реальные программы сообщают о своей работе
logging позволяет программе выдавать поток сообщений с отметкой времени и категорией. В отличие от print(), каждое сообщение несёт уровень важности, может направляться сразу в несколько мест (консоль, файл, сеть) и может быть усилено или приглушено без правки кода. Именно так программы среднего масштаба и промышленные системы сообщают, что произошло, когда и насколько это серьёзно.
- объяснить, почему
print()перестаёт годиться как инструмент отладки, - выбирать правильный из пяти уровней логирования,
- получать именованный логгер и понимать корневой логгер,
- подключать обработчики и форматтеры, чтобы отправлять записи в консоль и в файл,
- записывать исключения с полной трассировкой через
logger.exception.
1. Почему print() недостаточно
Когда вы только изучали язык, print() был естественным способом подсмотреть, что делает код. Он работает, но не имеет понятия о важности и никакой встроенной структуры. Все сообщения равны, все идут в стандартный вывод, а чтобы их заглушить, приходится физически удалять или комментировать строки.
Реальной программе нужно отвечать на вопросы: какая рутинная информация произошла? какие предупреждения мы пережили? какие ошибки действительно что-то сломали? С print() их не различить, и уж точно нельзя сказать "показывай предупреждения и хуже в продакшене, но всё во время отладки" без переписывания кода.
| Задача | print() | logging |
|---|---|---|
| Важность сообщения | нет, все равны | пять уровней |
| Куда идёт вывод | всегда stdout | любые подключённые обработчики |
| Отключить сообщения | править код | сменить одну настройку уровня |
| Время и источник | добавляете вручную | добавляет форматтер |
| Показать полную трассировку | вручную | exc_info / exception() |
Логирование сохраняет удобство "напечатать сообщение" и добавляет контроль, нужный растущей программе.