我有一个与 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 文件中,所以我不确定是否要更改它......你可以尝试这样的事情:
@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 传入的无效级别。
如果您愿意/拥有现有的动态配置服务,那么将其实现为过滤器是非常好的。
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/