logger.catch c аргументами

Я использую loguru для ведения логов. Можно ли при использовании @logger.catch() указать еще какие-либо аргументы?

Есть логер и функция в которую сыпятся сообщения

def func(error_message):
    ...
logger.add(func, catch=True)

И есть функция с декоратором генерирующая ошибку

@bot.message_handler(content_types=['text'])
@logger.catch()
def start(message):
    message.text / 2

При отлове ошибки, весь трейс я получаю в параметре error_message у func, можно как-то еще туда что-либо прокинуть? id пользователя скажем


Ответы (2 шт):

Автор решения: nubik

То что я искал - это loger.bind

def error_caught(message):
    result = loads(message)
    bot.send_message(...)

@bot.message_handler(content_types=['text'])
def main_func(message: Message):
    with my_loger.bind(user_id=message.from_user.id).catch():
        message.text / 2


my_loger.configure(extra={"user_id": "", })
my_loger.add(error_caught, format='{message}-{extra[user_id]}', serialize=True)
→ Ссылка
Автор решения: Evgeniy Blinov

В качестве альтернативы могу предложить логгер Polog. Там все варианты сбора логов (обычный вызов функции, декоратор, контекстный менеджер) работают через одну и ту же функцию. Давайте покажу, как это работает в случае контекстного менеджера.

Начнем с установки библиотеки:

$ pip install polog

Предварительно импортируем все необходимое и зарегистрируем обработчик, который будет записывать все логи в консоль:

from polog import log, config, file_writer

config.add_handlers(file_writer())

Перейдем к нашей теме: логирующий контекстный менеджер. Базовый случай применения выглядит вот так:

with log("my message"):
    ...

В данной конфигурации происходящее внутри блока кода будет записано. Результат в консоли будет выглядеть как-то так:

[2022-10-31 23:55:10.023636] |    1    | SUCCESS | MANUAL | "my message" | where: ? | time of work: 0.00001097 sec.

Также вы можете передать сюда какие-то дополнительные аргументы, они тоже запишутся:

with log("my message", lol="kek"):
    ...

Результат:

[2022-10-31 23:57:24.215530] |    1    | SUCCESS | MANUAL | "my message" | where: ? | time of work: 0.00001192 sec. | lol: "kek"

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

with log("my message", lol="kek") as context:
    context("the new message!", kek="lol")

Результат:

[2022-10-31 23:59:13.732950] |    1    | SUCCESS | MANUAL | "the new message!" | where: ? | time of work: 0.00001836 sec. | lol: "kek" | kek: "lol"

И последняя фича, вы можете улавливать исключения в данном блоке кода:

with log("my message", lol="kek").suppress() as context:
    context("the new message!", kek="lol")
    raise ValueError

Результат:

[2022-11-01 00:01:39.383987] |    2    |  ERROR  | MANUAL | "the new message!" | where: ? | time of work: 0.00037789 sec. | exception: ValueError("") | traceback: raise ValueError (".../some_file.py", line 7, in <module>) | lol: "kek" | kek: "lol"

Подробнее читайте в документации к библиотеке по ссылкам выше.

→ Ссылка