【问题标题】:FastAPI uvicorn not logging errorsFastAPI uvicorn 不记录错误
【发布时间】:2023-03-18 07:24:01
【问题描述】:

我正在学习 fastapi,我正在 localhost 上启动一个 uvicorn 服务器。每当出现错误/异常时,我都没有得到回溯。 我得到的只是:INFO: 127.0.0.1:56914 - "POST /create/user/ HTTP/1.1" 500 Internal Server Error

所以,很难调试,我正在尝试python的日志记录模块

 import logging
 log = logging.getLogger("uvicorn")
 log.setLevel(logging.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)


still the same problem persists. I am in development phase and I need to error traceback,please guide. 

【问题讨论】:

  • 我正在处理它...我目前正在将其追溯到默认情况下记录到 stderr 的“uvicorn.error”记录器,但我遇到了同样的问题,但它肯定源于记录 uvicorn.error 更改的配置。

标签: logging fastapi uvicorn


【解决方案1】:

如果您在调试模式下调用 FastAPI,则在发布请求期间发生“500 内部服务器错误”:

app = FastAPI(debug=True)

在 Chrome 开发工具网络标签打开的情况下重试请求。当您看到失败的请求出现时(注意 - 我的路由 url 在这里是 '/rule'):

单击它,您将在 Fetch/XHR / Response 选项卡窗口中看到 Traceback 文本。

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

【讨论】:

    【解决方案2】:

    解决方案/修复

    现在,当您通过 Python 中的命令 uvicorn.run(app) 执行 uvicorn 时,您的下一步是:

    采用 ucivorn 默认日志配置并将应用程序中的处理程序添加到其中:

    
    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'}
    

    这将使记录器远离 quart/Flask/等。 uvicorn 启动时启用。或者,您可以将 disable_existing_loggers 设置为 False。但这将使所有记录器保持启用状态,然后您可能会收到比您希望的更多的消息。

    最后,将配置传递给 uvicorn:

    uvicorn.run(app, **config)
    

    说明

    当 uvicorn 的日志记录配置将 disable_existing_loggers 设置为 True 时,所有其他记录器将被禁用。这也意味着记录器 quart 和 Flask 使用(打印回溯)被禁用。您可以将配置设置为不禁用其他记录器,或者将它们重新添加到配置中,这样 uvicorn 就不会首先禁用它们。

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 2021-04-12
      • 1970-01-01
      • 2021-04-12
      • 2022-11-03
      • 2021-04-02
      • 2021-07-30
      • 2020-05-24
      • 2021-10-29
      相关资源
      最近更新 更多