记录多租户 Flask 应用程序中并发请求的上下文信息

问题描述 投票:0回答:0

我目前正在开发一个 Flask 应用程序(MongoDB 后端),它每天为大约 50 个不同的租户运行其主要功能(有大量日志记录)。我有 JSON 日志记录设置,它与 Datadog 集成。我是否正在尝试将每个请求的 tenant_id 添加到为该租户创建的每个日志中。

发出请求时,会从令牌中提取

tenant_id
。因此,要将
tenant_id
添加到每个日志,我的方法是使用 @app.before_request 装饰器在每个请求之前提取
tenant_id
,然后使用 ContextFilter 将其添加到应用程序中每个记录器的处理程序。

   def before_request_function() -> None:
       tenant_id = get_tenant_from_token()
       f = ContextFilter(tenant_id)
       root_log = logging.getLogger()
       root_log_handler = root_log.handlers[0]
       root_log_handler.addFilter(f)
       for logger in logging.Logger.manager.loggerDict.values():
           if isinstance(logger, logging.Logger) and logger.parent == logging.getLogger():
               logger.propagate = False
               logger.addHandler(root_log_handler)

class ContextFilter(logging.Filter):
   
    def __init__(self, tenant_id: str):
        self.tenant_id = tenant_id

    def filter(self, record: logging.LogRecord) -> Any:
        record.tenantId = self.tenant_id
        return True

这似乎工作得很好,典型的日志看起来像这样

{"timestamp": "2023-03-06T13:11:19.483368+00:00", "level": "INFO", "message": "test", "tenantId": "test123"}

但是,我面临的挑战是,当向应用程序发出并发请求时,上下文信息(即

tenant_id
)被添加到应该与另一个租户关联的日志中。

我已经开始寻找 Django 而不是 Flask 来解决这个问题,但我希望有一个比迁移整个应用程序更简单的解决方案。

任何帮助都会很棒。

python flask logging concurrency multi-tenant
© www.soinside.com 2019 - 2024. All rights reserved.