Динамическое изменение уровня журналов в uvicorn

#python #logging #uvicorn

Вопрос:

У меня есть API Fastapi, работающий с uvicorn. Я использую ведение журнала uvicorn примерно так:

 if __name__ == "__main__":  uvicorn.run("main:app", host=host, port=int(port), reload=True, log_level=log_level,  log_config="config/logging.yaml")  

Чего я хотел бы достичь, так это иметь возможность изменять уровень log_level через конечную точку. Что-то вроде:

 @app.put("/api/log/{level}") def change_log_level(level):  #something that changes the log level.   

Я попытался создать глобальную переменную log_level , но это не сработало, и я не уверен, как ее изменить, так как уровень log_level указан в uvicorn.run инструкции. Это также есть в файле config.yaml, поэтому я не совсем уверен, что нужно было его менять…
Я готов попробовать ведение журнала с помощью другой библиотеки, если это необходимо

Ответ №1:

Вы могли бы попробовать что-то вроде этого:

 @app.put("/api/log/{level}") def change_log_level(level):  logging_level = your_function_to_map_url_level_to_logging_level(level)  logging.getLogger('uvicorn').setLevel(logging_level)  

Возможно, вы захотите сделать это для регистратора 'uvicorn' , как указано выше, или, возможно 'uvicorn.access' , или 'uvicorn.error' , или любую их комбинацию.

Есть uvicorn.config.LOG_LEVELS словарь , сопоставляющий строки, такие как 'critical' to logging.CRITICAL и т. Д. Возможно , вы захотите использовать это your_function_to_map_url_level_to_logging_level , но вам нужно будет обрабатывать недопустимые уровни, передаваемые по URL-адресу.

Комментарии:

1. вы не знаете, есть ли для чего-нибудь документация ? uvicorn.config.LOG_LEVELS не смог ничего найти…

2. @Од Нет, я использовал исходный код …