动态更改 uvicorn 中的日志级别

Dynamically change logs level in uvicorn

我有一个 Fastapi API 运行 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 文件中,所以我不确定是否要更改它...
如果需要,我愿意尝试使用另一个库进行日志记录

您可以尝试这样的操作:

@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'logging.CRITICAL 等。您可能想在 your_function_to_map_url_level_to_logging_level 中使用它,但您需要处理通过 URL.

传递的无效级别