Skip to main content

pybotx-smart-logger

Shows logs when you need it

Requirements

  • Python 3.10+

Проблема/решение

В основном наши боты работают в закрытых контурах. Там невозможно использовать Sentry, поэтому наш главный помощник в диагностике неполадок - логи контейнера.

Однако, если сделать логи слишком подробными, то действительно важную информацию будет очень сложно найти. Также мы получим проблемы избыточного использования постоянной памяти или слишком быструю ротацию логов. Но сделав логи слишком сжатыми, мы рискуем столкнуться с ситуацией, когда их недостаточно для диагностики ошибки.

То есть хочется видеть как можно больше информации во время возникновения ошибок, и как можно меньше - когда всё хорошо.

Использование

Используя функцию smart_log(log_message: str, *args: Any, **kwargs: Any) логируете всю информацию, которая поможет в диагностике ошибки. Если во время обработки сообщения будет выброшено исключение, в логи попадёт:

  1. Текущее сообщение от пользователя,
  2. Вся залогированная с помощью smart_log информация,
  3. Выброшенное исключение.

Если обработка сообщения завершится успешно, накопленные логи будут "выброшены".

Настройка

  1. Устанавливаем библиотеку:
poetry add pybotx-smart-logger
  1. Подключим мидлварь для логирования входящих сообщений:

middlewares/smart_logger.py

async def smart_logger_middleware(
    message: IncomingMessage,
    bot: Bot,
    call_next: IncomingMessageHandlerFunc,
) -> None:
    async with wrap_smart_logger(
        log_source="Incoming message",
        context_func=lambda: format_raw_command(message.raw_command),
        debug=True,
    ):
        await call_next(message, bot)

bot.py

Bot(
    collectors=[collector],
    bot_accounts=[BOT_CREDENTIALS],
    middlewares=[
        smart_logger_middleware,
    ],
)
  1. Для того чтобы логировать какие-то другие части приложения, необходимо обернуть в контекстный менеджер:
async def handler() -> None:
    async with wrap_smart_logger(
        log_source="Request to Server",
        context_func=lambda: str(kwargs),
        debug=False,
    ):
        await make_request(**kwargs)
  1. Также можно использовать smart_logger для логирования запросов к FastAPI приложению:
app = FastAPI()


@app.middleware("http")
async def smart_logger_middleware(request: Request, call_next: Callable) -> None:
    async with wrap_smart_logger(
        log_source="Incoming request",
        context_func=lambda: pformat_str_request(request),
        debug=DEBUG,
    ):
        return await call_next(request)

log_source определяет источник логов. context_func - пользовательская функция для форматирования логов.

Пример команд для включения отладки

@collector.command("/_debug:enable-for-huids", visible=False)
async def enable_debug_for_users(message: IncomingMessage, bot: Bot) -> None:
    try:
        huids = [UUID(huid) for huid in message.arguments]
    except ValueError:
        await bot.answer_message("Получен невалидный user_huid")
        return

    # TODO: Обновите список user_huid

    await bot.answer_message(f"Список user_huid для отладки обновлён {huids}")
@collector.command("/_debug:enable-for-tasks", visible=False)
async def enable_debug_for_tasks(message: IncomingMessage, bot: Bot) -> None:
    # TODO: Обновите список имён задач

    await bot.answer_message("Список задач для отладки обновлён")

Группировка сообщений логера

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

async def smart_logger_middleware(
    message: IncomingMessage,
    bot: Bot,
    call_next: IncomingMessageHandlerFunc,
) -> None:
    async with wrap_smart_logger(
        log_source="Incoming message",
        context_func=lambda: format_raw_command(message.raw_command),
        debug=True,
        group=True,  # Enable grouping
    ):
        await call_next(message, bot)

Теперь всё, что было залогировано через функцию smart_log будет "выброшено" только после обработки сообщения и не будет перемешано с логами других сообщений.

Работает только с включенным DEBUG

Где применять

  1. Проверка роли:
# TODO: Мидлварь для заполнения message.state.user


async def subscribed_users_only_middleware(
    message: IncomingMessage,
    bot: Bot,
    call_next: IncomingMessageHandlerFunc,
) -> None:
    if not message.state.user.is_subscribed:
        await bot.send(message=only_subscribed_users_allowed_message(message))

        return

    smart_log("This user is subscribed")

    await call_next(message, bot)
  1. Обращение в API:
async def _perform_request(
    method: Literal["GET", "POST"],
    url: str,
    query_params: Optional[Dict[str, Any]] = None,
    body_dict: Optional[Dict[str, Any]] = None,
) -> str:
    smart_log("Performing request to YourAwesomeAPI")
    smart_log("Method:", method)
    smart_log("URL:", url)
    smart_log("Query parameters:", query_params)
    smart_log("Body dict:", body_dict)

    try:
        async with AsyncClient(base_url=base_url) as client:
            response = await client.request(
                method,
                url,
                params=query_params,
                json=body_dict,
            )
    except HTTPError as exc:
        raise RequestToAwesomeAPIError from exc

    smart_log("Response text:", response.text)

    try:
        response.raise_for_status()
    except HTTPStatusError as exc:  # noqa: WPS440
        raise InvalidStatusCodeFromAwesomeAPIError from exc

    return response.text

А также любые моменты, где что-то может пойти не так. Логируйте - не стестяйтесь.

Metadata

Release files for pybotx-smart-logger 0.12.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pybotx-smart-logger 0.12.1
File Size Uploaded
pybotx_smart_logger-0.12.1.tar.gz 7.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pybotx-smart-logger 0.12.1
File Interpreter ABI Platform
pybotx_smart_logger-0.12.1-py3-none-any.whl Python 3 none any Details

Total release size: 16.3 kB

Release files / pybotx_smart_logger-0.12.1.tar.gz

Download URL pybotx_smart_logger-0.12.1.tar.gz
Size 7.3 kB
Tags Source
SHA-256 checksum
How to use checksums
ea7e98a96f8a4d5d858784c10c5b7882d2f0723e6cd88705c5208d076bc6ed2e
BLAKE2b-256 checksum
How to use checksums
0521ad54947f4bf828b2dafad714d9238e07b5550b0e16491ef79534ece4fe57
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.3.3 CPython/3.13.1 Linux/6.8.0-1044-azure

Release files / pybotx_smart_logger-0.12.1-py3-none-any.whl

Download URL pybotx_smart_logger-0.12.1-py3-none-any.whl
Size 9.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f19df2b391faa404f19f58e97aeb22990af0f04a404a4395581419a68fe3e1fe
BLAKE2b-256 checksum
How to use checksums
0b95761f5ad47fb1987d5303110778f79e2bda20f975ea902c925e0c09f702a3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.3.3 CPython/3.13.1 Linux/6.8.0-1044-azure

Release history Release notifications | RSS feed

This release

0.12.1 This release

2 release files

0.12.0

2 release files

0.11.1

2 release files

0.11.0

2 release files

0.10.1

2 release files

0.10.0

2 release files

0.9.9

2 release files

0.9.8

2 release files

0.9.7

2 release files

0.9.6

2 release files

0.9.5

2 release files

0.9.4

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.5

2 release files

0.7.4

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.9

2 release files

0.6.8

2 release files

0.6.7

2 release files

0.6.6

2 release files

0.6.5

2 release files

0.6.4

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page