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 中提取它
也许这里有人知道如何解决我的问题。我有一个由 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 中提取它