动态更改uvicorn中的日志级别

问题描述 投票:0回答:2

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

python logging uvicorn
2个回答
4
投票

你可以尝试这样的事情:

@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 传入的无效级别。


0
投票

如果您愿意/拥有现有的动态配置服务,那么将其实现为过滤器是非常好的。

root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG) # set to DEBUG so that LoggerFilter will see all log records
ch = logging.StreamHandler(sys.stdout)
root_logger.addHandler(ch)
# key step - add the Prefab LoggerFilter to the StreamHandler
ch.addFilter(LoggerFilter())

该过滤器将拥有进行查找并获得所需日志级别所需的所有信息。 https://github.com/prefab-cloud/prefab-cloud-python/blob/main/prefab_cloud_python/logging.py#L32 是一个示例。

我做了一个教程/演练:

https://www.prefab.cloud/blog/dynamic-logging-in-fastapi-with-python/

© www.soinside.com 2019 - 2024. All rights reserved.