Starlette框架的日志和错误处理
Starlette 是一个轻量级的异步 Python 框架,用于构建高性能的 Web 应用程序。它内置了强大的日志和错误处理机制,方便开发人员进行调试和监控。
日志处理
----------------
Starlette 使用 logging 库进行日志记录。我们可以通过配置日志处理器,更改日志的格式和输出位置。
下面是一个示例,演示如何在 Starlette 中配置和使用日志处理器:
import logging
from starlette.applications import Starlette
from starlette.responses import JSONResponse
# 创建一个名为 app 的 Starlette 应用程序
app = Starlette()
# 配置日志处理器
logging.basicConfig(level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[
logging.FileHandler(filename="app.log"),
logging.StreamHandler()
])
@app.route("/")
async def homepage(request):
# 记录一条 info 级别的日志
logging.info("Received request to homepage")
return JSONResponse({"message": "Hello, World!"})
@app.on_event("startup")
async def startup():
# 记录一条 info 级别的日志
logging.info("Application startup")
@app.on_event("shutdown")
async def shutdown():
# 记录一条 info 级别的日志
logging.info("Application shutdown")
在上面的示例中,我们首先通过 logging.basicConfig() 方法配置了我们的日志处理器。在这里,我们将日志级别设置为 INFO,日志格式设置为 %(asctime)s [%(levelname)s] %(message)s,并将日志同时输出到文件 app.log 和控制台。你可以根据需要进行调整。
之后,我们定义了一个基本的 Starlette 应用程序,并创建了一个名为 homepage 的路由处理函数。在这个函数中,我们记录了一条信息级别的日志。在 startup() 和 shutdown() 方法中,我们也分别记录了一条信息级别的日志。
通过以上配置,我们的应用程序将在控制台和文件 app.log 中输出类似以下内容的日志:
2021-01-01 00:00:00,000 [INFO] Received request to homepage
错误处理
----------------
Starlette 提供了 ExceptionMiddleware 中间件,用于全局捕获和处理应用程序中发生的异常。
下面是一个示例,演示如何在 Starlette 中配置和使用错误处理中间件:
from starlette.applications import Starlette
from starlette.middleware.errors import ServerErrorMiddleware
from starlette.responses import JSONResponse, PlainTextResponse
from starlette.exceptions import HTTPException
# 创建一个名为 app 的 Starlette 应用程序
app = Starlette()
# 定义一个路由处理函数,触发 500 错误
@app.route("/error")
async def error_route(request):
raise Exception("Oops! Something went wrong.")
# 自定义错误处理函数
async def server_error_handler(request, exc):
# 处理 500 错误
return PlainTextResponse("Internal Server Error", status_code=500)
# 创建错误处理中间件
middleware = [
ServerErrorMiddleware(handler=server_error_handler)
]
# 将中间件应用到 Starlette 应用程序
app.middleware_stack.add_middleware(ServerErrorMiddleware)
# 添加全局异常处理器
@app.exception_handler(HTTPException)
async def http_exception_handler(request, exc):
# 处理 HTTPException
return JSONResponse({"error": str(exc)}, status_code=exc.status_code)
@app.exception_handler(Exception)
async def default_exception_handler(request, exc):
# 处理其他异常
return JSONResponse({"error": "Internal Server Error"}, status_code=500)
在上面的示例中,我们首先定义了一个名为 error_route 的路由处理函数,当请求该路由时,会抛出一个 Exception 异常,触发 500 错误。
然后,我们定义了一个自定义的错误处理函数 server_error_handler,用于处理 500 错误。在这个函数中,我们返回了一个简单的纯文本响应。
接下来,我们创建了一个 ServerErrorMiddleware 实例,并将之前定义的错误处理函数作为参数传递给它。然后,我们将该中间件应用到我们的 Starlette 应用程序。
最后,我们定义了两个全局异常处理器函数 http_exception_handler 和 default_exception_handler。http_exception_handler 函数用于处理 HTTPException 异常,default_exception_handler 函数用于处理其他异常。在这些函数中,我们返回了一个 JSON 响应,包含适当的错误消息和状态码。
通过以上配置,当应用程序发生 500 错误时,返回的响应将是一个简单的纯文本消息。
综上所述,我们已经学习了如何在 Starlette 中配置和使用日志和错误处理机制。通过适当地配置日志处理器,我们可以实现对应用程序的日志记录。而使用错误处理中间件和全局异常处理器,我们可以处理应用程序中发生的异常,并返回适当的响应给客户端。
