fastapi加入全局异常捕捉,日志系统,fastapi拦截器,启动脚本
时间: 2025-05-26 16:28:17 浏览: 54
### 实现全局异常处理
在 FastAPI 中,可以通过 `add_exception_handler` 方法注册自定义的异常处理器来捕获并统一处理各种类型的异常。这使得开发者能够集中管理错误响应格式,提升用户体验。
```python
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
from pydantic import ValidationError
app = FastAPI()
@app.exception_handler(ValidationError)
async def validation_exception_handler(request: Request, exc: ValidationError):
return JSONResponse(
status_code=422,
content={"detail": "Validation Error", "errors": exc.errors()},
)
```
此代码片段展示了如何为 Pydantic 的验证错误设置一个全局异常处理器[^3]。
---
### 配置日志系统
为了增强项目的可观测性和调试能力,推荐集成 Logstash 或者直接使用 Python 自带的日志模块 (logging) 来记录应用程序中的重要事件和错误信息。
以下是基于 logging 模块的一个基本配置:
```python
import logging
from fastapi import FastAPI
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
app = FastAPI()
@app.get("/")
def read_root():
logger.info("Root endpoint was accessed.")
return {"message": "Hello World"}
```
如果需要更复杂的日志管道,则可以引入像 Logstash 这样的工具,利用其 inputs-filters-outputs 架构完成高级日志收集与分析任务[^2]。
---
### 添加请求拦截器
虽然 FastAPI 并未提供传统意义上的“拦截器”,但通过 Middleware 可以实现类似的功能。Middleware 是一种用于修改进入或离开应用的数据流的技术。
下面的例子展示了一个简单的中间件用来打印每次 HTTP 请求的相关细节:
```python
from starlette.middleware.base import BaseHTTPMiddleware
from fastapi import FastAPI, Request
class LoggingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
response = await call_next(request)
logging.info(f"{request.method} {request.url.path}")
return response
app = FastAPI()
app.add_middleware(LoggingMiddleware)
```
这段代码说明了如何创建一个自定义 middleware 类,并将其添加到 FastAPI 应用实例中以便于跟踪所有的入站流量。
---
### 编写启动脚本
对于生产环境下的部署来说,编写清晰简洁的启动脚本是非常重要的一步。通常我们会采用 ASGI 服务器如 Uvicorn 结合 Gunicorn 来运行我们的 FastAPI 应用程序。
这里给出一个典型的 Dockerfile 和 entrypoint.sh 文件作为例子:
#### Dockerfile
```dockerfile
FROM python:3.9-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["./entrypoint.sh"]
```
#### Entrypoint Script (`entrypoint.sh`)
```bash
#!/bin/bash
set -e
uvicorn main:app \
--host 0.0.0.0 \
--port 8000 \
--workers $(nproc) \
--log-level info &
wait $!
```
以上两个文件共同描述了一种自动化构建镜像的方式以及指定服务启动命令的方法[^1]。
---
阅读全文
相关推荐

















