FastapiUvicorn不记录错误

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

,很难调试,我正在尝试登录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时,这是您的下一步:
python logging fastapi uvicorn
4个回答
15
投票
获取UCivorn默认日志记录配置,然后将处理程序从您的应用程序中添加到它:

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)

用Chrome Dev Tools网络选项卡打开请求。 当您看到失败的请求显示时(注意 - 我的路线URL在这里是'/rule'):


9
投票
单击它,您将在fetch / xhr / wendment选项卡窗口中看到追溯文本。

您可以通过在您的帖子处理程序中插入“断言false”来快速验证它。

Failed_XMLHttpRequest最有可能是一种更优雅的方法,但是简单的黑客是制作一个只能打印异常的中间件;

disable_existing_loggers

ref:如何捕获和打印完整的异常追溯,而无需停止/退出程序?Traceback_in_Response_Window

初始代码有效,但是您选择了错误的处理程序。要获取有关错误的追溯,您需要修改

3
投票
logger。

例如:

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配置的任何隐性行为也将保留任何隐式行为。


0
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.