Перейти к содержанию

LOGGING

Propan использует для логирования 2 зараннее сконфигурированных логера:

  • propan - используется PropanApp
  • propan.access - используется брокером

Логирование запросов

Для логирования запросов настоятельно рекомендуется использовать access_logger вашего брокера, т.к. он доступен через Context вашего приложения.

from propan import RabbitBroker
from propan.annotations import Logger

broker = RabbitBroker()

@broker.handle("test")
async def func(logger: Logger):
    logger.info("message received")

Такой подход несет несколько преимуществ:

  • используемый логер уже содержит контекс запроса: идентификатор сообщения, источник его получения
  • заменив logger при инициализации вашего брокера вы автоматически замените все логеры внутри ваших функций

Уровни логирования

Если вы используете Propan CLI, вы можете изменить текущий уровень логирования всего приложения прямо из командной строки.

Флаг --log-level устанавливает текущий уровень логирования как для брокера, так и для PropanApp. Так вы можете настраивать уровни не только дефолтных логеров, но и собственных, если используете их внутри Propan

$ propan run serve:app --log-level debug

Если же вы хотите полностью отключить дефолтное логирование Propan, вы можете установить logger=None

from propan import PropanApp, RabbitBroker

broker = RabbitBroker(logger=None)    # отключает логи broker'а
app = PropanApp(broker, logger=None)  # отключает логи приложения

Warning

Будьте аккуратны: logger, который вы получаете из контекста также будет иметь значение None, если вы выключите логирование брокера

Если же вы не хотите терять доступ к logger'у внутри вашего контекста, но хотите избавиться от дефолтных логов Propan, вы можете понизить уровень логов, который публикует сам брокер.

import logging
from propan import PropanApp, RabbitBroker

# устанавливает логи самого брокера на уровень DEBUG
broker = RabbitBroker(log_level=logging.DEBUG)

Форматирование логов

Если вас не устраивает текущий формат логов вашего приложения, вы можете легко изменить его прямо в конструкторе вашего брокера

from propan import PropanApp, RabbitBroker
broker = RabbitBroker(log_fmt="%(asctime)s %(levelname)s - %(message)s")

Использование собственных логеров

Так как Propan работает со стандартным объектом logging.Logger, вы можете инициировать приложение и брокера с помощью своего собственного логера

import logging
from propan import PropanApp, RabbitBroker

logger = logging.getLogger("my_logger")

broker = RabbitBroker(logger=logger)
app = PropanApp(broker, logger=logger)

При этом вы потеряете информацию о контексте текущего запроса. Однако, вы можете получить ее напрямую из контекста в любом месте вашего кода:

from propan import context
log_context: dict[str, str] = context.get_local("log_context")

Доступ к logger

Если же вы хотите переопределить поведение дефолтных логеров, вы можете получить доступ к ним напрямую через logging:

import logging
logger = logging.getLogger("propan")
access_logger = logging.getLogger("propan.access")
Или импортируя их из Propan

from propan.log import access_logger, logger