Короткий ответ
print() всегда пишет в stdout без уровней и фильтрации, а logging поддерживает уровни важности (DEBUG, INFO, WARNING, ERROR, CRITICAL) и может отправлять сообщения сразу в несколько мест без изменения кода приложения.
Как это работает подробнее
logging построен на логгерах, обработчиках и уровнях; логгер фильтрует сообщения по уровню, а обработчики решают, куда их направить и в каком формате.
Пример кода
example.py
import logging
logger = logging.getLogger(__name__)
def process_order(order_id):
logger.info("Processing order %s", order_id)
try:
...
except PaymentError as exc:
logger.error("Payment failed for order %s: %s", order_id, exc)
raiseЧто использовать на практике
- Рекомендация. DEBUG — подробности разработки; INFO — обычные события; WARNING — отклонение от штатного режима; ERROR — операция не выполнена; CRITICAL — сервис нерабочий. Настройку делают один раз в точке входа.
Подводные камни
- Риск. разбрасывать
print()по коду вместо logging — такие сообщения невозможно централизованно фильтровать, а в Gunicorn они перемешиваются в stdout; логировать как ERROR ожидаемую бизнес-ситуацию, создавая шум в алертах.