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 шт):
То что я искал - это 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)
В качестве альтернативы могу предложить логгер 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"
Подробнее читайте в документации к библиотеке по ссылкам выше.