我目前正在开发一个 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 来解决这个问题,但我希望有一个比迁移整个应用程序更简单的解决方案。
任何帮助都会很棒。