FastAPI抛出HTTPException时如何让控制台显示完整堆栈追踪?
在FastAPI中记录HTTPException的完整堆栈追踪
FastAPI默认不会为HTTPException记录堆栈追踪,因为它被视为业务预期内的异常。要实现日志中输出完整堆栈,无需通过中间件,推荐用以下两种方式:
方法一:全局自定义异常处理器
通过覆盖默认的HTTPException处理器,统一记录所有此类异常的堆栈信息,同时保持客户端响应正常。
import uvicorn import logging import traceback from fastapi.exceptions import HTTPException from fastapi import FastAPI, Request from fastapi.responses import JSONResponse # 初始化日志配置,设置级别为ERROR logging.basicConfig( level=logging.ERROR, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) logger = logging.getLogger(__name__) app = FastAPI() # 自定义HTTPException处理函数 @app.exception_handler(HTTPException) async def log_http_exception(request: Request, exc: HTTPException): # 记录异常详情及完整堆栈 logger.error(f"请求路径: {request.url}\n异常信息: {exc.detail}\n堆栈追踪:\n{traceback.format_exc()}") # 返回标准HTTPException响应,确保客户端正常接收 return JSONResponse( status_code=exc.status_code, content={"detail": exc.detail} ) @app.get("/info") def info(): try: x = 1/0 except ZeroDivisionError as e: raise HTTPException(status_code=400, detail=str(e)) if __name__ == '__main__': uvicorn.run(app, port=8000)
方法二:局部手动记录日志
如果仅需在特定接口记录堆栈,可在抛出HTTPException前直接记录当前异常的堆栈:
import uvicorn import logging import traceback from fastapi.exceptions import HTTPException from fastapi import FastAPI logging.basicConfig( level=logging.ERROR, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) logger = logging.getLogger(__name__) app = FastAPI() @app.get("/info") def info(): try: x = 1/0 except ZeroDivisionError as e: # 捕获异常时直接记录堆栈 logger.error(f"接口/info执行出错\n堆栈追踪:\n{traceback.format_exc()}") raise HTTPException(status_code=400, detail=str(e)) if __name__ == '__main__': uvicorn.run(app, port=8000)
关键说明
- 无需使用中间件,FastAPI的异常处理器机制更适合这类需求,符合框架设计逻辑。
traceback.format_exc()会返回包含出错文件、行号、调用链的完整堆栈字符串。- 可根据需求调整日志格式,比如添加请求方法、客户端IP等信息,提升排查效率。
内容的提问来源于stack exchange,提问作者mikazz
相关产品推荐
相关产品推荐

