Исправляю старые баги, добавляю новые · 21 февр 2021
Используйте логирование вместо print для поиска ошибок
Часто Python разработчики, особенно новички, используют функцию print(), чтобы увидеть, что происходит в программе, этакая отладка программы в реальном времени. И вполне возможно, что по завершению разработки, вы столкнетесь с проблемой необходимости закомментировать все эти многочисленные вызовы print().
Гораздо более удобный способ – это логирование или ведение журнала сообщений. Вы даже сможете ограничить свой вывод командной строки, в зависимости от пожеланий конечного пользователя.
Почему логирование?
Логирование – это удобный инструмент для просмотра состояния программы на этапе разработки. Его использование идеально подходит, если вы:
Хотите отделить друг от друга вывод отладки и вывод программы.
Не хотите использовать лишний вывод в вашем конечном продукте.
Хотите отключить все выводы после разработки и тестирования.
Хотите сохранить историю выполнения программы в файл с полезной для вас метаинформацией, такой как временные метки или подробные отладочные данные.
Как создать логирование?
Логирование в Python осуществляется с помощью модуля logging. Для начала нужно его импортировать:
import logging
Этот модуль по умолчанию предоставляет несколько стандартных состояний (уровней) для записи различных статусов сообщений. Уровни по умолчанию: DEBUG,INFO,WARNING,ERROR, CRITICAL.
Если вы выполните следующую программу:
import logging
import os
save_path = "path/to/save/at/"
if not os.path.exists(save_path):
logging.warning(f"Внимание. Путь {save_path} не существует. "
"Сохранение в текущей директории...")
save_path = os.getcwd()
logging.debug(f"save_path перезаписана: {save_path}")
else:
logging.debug(f"Путь корректный, сохранено в {save_path}")
Пути save_path в этом примере не существует, и вы увидите следующее:
WARNING:root:Внимание. Путь path/to/save/at/ не существует.
Сохранение в текущей директории...
И хоть вы в программе изменили savepath, logging.debug не отобразился.
Это происходит потому, что уровень вывода сообщений по умолчанию – «warning». Порядок приоритета вывода уровней сообщений выглядит следующим образом (в порядке возрастания):
DEBUG
INFO
WARNING (по умолчанию)
ERROR
CRITICAL
Если вы хотите увидеть сообщения с более низким приоритетом, то должны явно установить их уровень в настройках модуля logging. Пропишите эту настройку в начало файла и перезапустите интерпретатор. Иначе, изменения не будут работать:
logging.basicConfig(level=logging.DEBUG)
Теперь все сообщения будут отображаться, начиная с уровня DEBUG.
WARNING:root:Внимание. Путь path/to/save/at/ не существует.
Сохранение в текущей директории...
DEBUG:root:save_path перезаписана: C:\projects\shop
Отлично, теперь вы простой способ отлаживать код.
Запись в файл
Но для логирования на более серьезном уровне вы, возможно, захотите увидеть больше полезной информации и вывести ее в отдельный файл. Это можно сделать, используя параметры format и filename в конфигурации вашего логгера. Просто нужно обновить настройки:
Это сохранит вашу информацию в файл logfilename.log вместе с временем.
21/02/2021 05:03:13 PM Внимание. Путь path/to/save/at/ не существует. Сохранение в текущей директории... 21/02/2021 05:03:13 PM save_path перезаписана: C:\projects\shop
И при следующем запуске вашей программы все сообщения (или логи) будут добавляться в этот файл, так что у вас будет вся история логирования в одном месте.
А можно это изменить, и каждый раз создавать новый лог-файл. Для этого добавьте в logging.basicConfig параметр filemode='w'
Логирование можно централизованно отключить, не оформляя как комментарий каждое из сообщений. Добавьте в программу следующее:
Кроме того, вы можете изменить уровень вывода, необходимый для записи в файл логов, чтобы конечному пользователю были доступны только предупреждения и сообщения о критических ошибках.
Логирование > print()
Это был маленький пример создания логирования на Python. Оно предоставляет гораздо больше возможностей, чем описано выше (обработчики, фильтры, изменение уровней вывода по умолчанию и т. д.) Но даже этого примера достаточно, чтобы начать использовать базовое логирование и покончить с бесконечным добавлением/удалением функции print().
Andrey Golovinov, я не настаиваю, но крайне рекомендую.
Если писать проект несколько месяцев, заметите, как принты добавляются/удаляются в одни и те же места. Это называют неэффективностью. А логирование все-равно нужно использовать, что бы отслеживать ошибки в продакшене.