Динамически установить уровень журнала Sanic в Python

Я открыл маршрут в своем приложении Sanic, чтобы установить уровень журнала на основе клиентского вызова. Например.

from sanic.log import logger, logging

@route("/main")
async def sanic_main(request):
    logger.info("Info mesg")
    logger.debug("Debug mesg")

    return json("processed")

@route("/setlevel")
async def setlevel(request):
    level = request.json["level"]
    if level == "info":
         loglevel = logging.INFO
    elif level == "debug":
         loglevel = logging.DEBUG
    logger.setLevel(loglevel)

    return json("done")

Однако при установке уровней журнала между DEBUG и INFO я наблюдаю нестабильное поведение, когда сообщения DEBUG (из «/ main») печатаются только несколько раз и наоборот.

ПРИМЕЧАНИЕ. Я запускаю несколько рабочих процессов Sanic.

Как я должен динамически устанавливать уровень журнала?


person sandyp    schedule 15.01.2020    source источник
comment
На мой взгляд, лучшим решением для этой задачи будет встроенная функция фильтрации в журнале Python.   -  person Fine    schedule 20.01.2020


Ответы (2)


Я никогда не делал ничего подобного, но sanic.log.logger — это всего лишь экземпляр <class 'logging.Logger'>. Итак, использование setLevel должно быть в порядке.

Вопрос в том, как вы запускаете свое приложение и сколько рабочих процессов вы используете? Если вы находитесь в ситуации, когда у вас есть несколько процессов, то использование /setlevel изменит регистратор только для этого одного процесса.

person The Brewmaster    schedule 16.01.2020
comment
У меня есть несколько (4) рабочих. Как сделать так, чтобы уровень журнала синхронизировался для всех рабочих процессов? - person sandyp; 16.01.2020
comment
Тогда точно проблема. Я думаю, что есть так много потенциальных способов сделать это, что вопрос становится очень широким для SO. Разместите свой вопрос на форумах Sanic, и я постараюсь помочь вам решить его там в более понятном формате: community.sanicframework .org - person The Brewmaster; 16.01.2020
comment
Сделаю. Кстати, ваш комментарий заставил меня задуматься, имеет ли смысл хранить уровень журнала вне приложения (в Redis). Таким образом, когда клиент вызывает маршрут, декоратор может проверить и установить уровень журнала перед обслуживанием каждого запроса. Что вы думаете? Меня беспокоит только дополнительная задержка, но с Redis я не ожидаю, что это будет иметь большое значение. - person sandyp; 16.01.2020
comment
Для справки: stackoverflow.com/questions/59760808/ @sandyp ответит в теме - person The Brewmaster; 17.01.2020

Один из способов сделать это — использовать aioredis, как показано в блоге здесь:

https://medium.com/@sandeepvaday/route-triggered-state-update-across-python-sanic-workers-a0f7ab0f6e4

person sandyp    schedule 22.06.2020