,很难调试,我正在尝试登录Python
的记录模块
import logging
log = logging.getLogger("uvicorn")
log.setLevel(logging.DEBUG)
我还尝试使用Debug参数启动Uvicorn
if __name__ == "__main__":
dev = 1
print("printing")
if dev == 1:
uvicorn.run('main:app', host="127.0.0.1", port=5000, log_level="info", reload=True, debug=True)
if dev == 2:
uvicorn.run('main:app', host="127.0.0.1", port=5000, log_level="info", workers=2)
因为同样的问题仍然存在。我处于开发阶段,我需要错误追溯,请指导。
solution /fix现在,当您通过python命令执行Uvicorn时,这是您的下一步:
uvicorn.run(app)
这将使记录仪保持在夸脱/烧瓶/等。当Uvicorn启动时启用。另外,您可以将
config = {}
# this is default (site-packages\uvicorn\main.py)
config['log_config'] = "{
"version":1,
"disable_existing_loggers":true,
"formatters":{
"default":{
"()":"uvicorn.logging.DefaultFormatter",
"fmt":"%(levelprefix)s %(message)s",
"use_colors":"None"
},
"access":{
"()":"uvicorn.logging.AccessFormatter",
"fmt":"%(levelprefix)s %(client_addr)s - \"%(request_line)s\" %(status_code)s"
}
},
"handlers":{
"default":{
"formatter":"default",
"class":"logging.StreamHandler",
"stream":"ext://sys.stderr"
},
"access":{
"formatter":"access",
"class":"logging.StreamHandler",
"stream":"ext://sys.stdout"
}
},
"loggers":{
"uvicorn":{
"handlers":[
"default"
],
"level":"INFO"
},
"uvicorn.error":{
"level":"INFO",
"handlers":[
"default"
],
"propagate":true
},
"uvicorn.access":{
"handlers":[
"access"
],
"level":"INFO",
"propagate":false
}
}
}
# add your handler to it (in my case, I'm working with quart, but you can do this with Flask etc. as well, they're all the same)
config['log_config']['loggers']['quart'] =
{
"handlers":[
"default"
],
"level":"INFO"
}
设置为false。但这将使所有登录器启用,然后您可能会收到比您想要的更多的消息。
最终将配置传递给Uvicorn:
disable_existing_loggers
解释
当Uvicorn的日志记录配置设置为true时,将禁用所有其他记录器。这也意味着Logger Quart和Flask使用(打印回溯)被禁用。您可以将配置设置为不禁用其他登录器,也可以将它们重新添加到配置中,以便Uvicorn首先不会禁用它们。
对于在调试模式下调用FastApi,在邮政请求期间发生的“ 500个内部服务器错误”:
uvicorn.run(app, **config)
您可以通过在您的帖子处理程序中插入“断言false”来快速验证它。
最有可能是一种更优雅的方法,但是简单的黑客是制作一个只能打印异常的中间件;
disable_existing_loggers
ref:如何捕获和打印完整的异常追溯,而无需停止/退出程序?
初始代码有效,但是您选择了错误的处理程序。要获取有关错误的追溯,您需要修改
例如:
import traceback
...
async def catch_exceptions_middleware(request: Request, call_next):
try:
return await call_next(request)
except Exception as e:
print(traceback.format_exc())
raise e
app.middleware('http')(catch_exceptions_middleware)
# Then your normal endpoint code;
@app.get('/error-endpoint')
def endpoint():
a = 1 / 0
return {"result": a}
其他可用的默认记录器是"uvicorn.error"
和 import logging
log = logging.getLogger("uvicorn.error")
log.setLevel(logging.DEBUG)
,如 @theclocktwsiter的答案所示。这样,您就无需复制/修改整个日志记录配置。如果Dev Team对Uvicorn Loggging配置的任何隐性行为也将保留任何隐式行为。