Fast API Python 每个请求的特殊日志参数

Fast API Python special log parameter for each request

也许这里有人知道如何解决我的问题。我有一个由 FastAPI 驱动的 REST API 项目。每个传入请求都在 header 中带有一个哈希值。我正在寻找一个简单的解决方案来将此哈希作为额外参数写入日志。我想避免每手每次都添加它。我首先提出了编写中间件的解决方案,该中间件将哈希写入记录器 Object ,然后使用 loggerObject.log() 自动添加哈希的函数。但这只适用于我自己的日志消息。来自例如异常或来自我使用的库的日志消息没有额外参数。

我使用 structlog 库解决了类似的问题。它允许您设置将输出到每个日志行的全局上下文变量。 请注意,这仅适用于 structlog 输出的日志,需要特殊配置才能使用这些上下文变量输出 stdlib 日志记录。

这是我编写的一个演示 FastAPI 应用程序,它为每个传入的 http 请求生成一个 request-id,并将请求 ID 添加到该 HTTP 请求期间输出的每个日志行。 在此示例中,我已将 stdlib 日志记录配置为由 structlog 处理,因此向它们添加了 request-id 参数。
https://gitlab.com/sagbot/structlog-demo

演示中的参考文件:

  • demo/route.py - 一堆演示路线。请注意 /long 路由同时输出 stdlib 日志和 structlog 日志,但它们都使用 request-id 属性
  • 输出
  • demo/configure-logging.py - 此函数配置 structlog 和 stdlib 日志记录。请注意,在 stdlib 日志中显示上下文变量所需的“特殊配置”在此 func 中,我在 logging.config.dictConfig(...) func
  • 中添加了自定义格式化程序
  • demo/middlewares/request_logging/middleware.py - 这是生成 request-id 并将其添加到日志的中间件。您可以更改此中间件以不生成该值,而是根据需要从传入请求的哈希 header 中提取它