处理多租户的 Log4net 最佳实践(1 个输出文件)



所以我的webapi解决方案适用于多个租户,我希望日志记录是这样的:

2018-05-09 11:06:00,490 ((租户 ID(( [12] 信息 方法名称 - 日志

2018-05-09 11:07:00,490((如果调用不在租户级别,则为默认值(( [12] 警告方法名称 - 日志

我解决解决方案的想法是使用

log4net.ThreadContext.Properties["tenantId"] = tenantId;

但话又说回来,我无法访问解决方案的每个级别的 tenantId。我试图将它添加到我的基本控制器(实现 ApiController(中,如下所示

protected override void Initialize(HttpControllerContext 
controllerContext)
{
var tenantIdentifier = 
requestUtils.GetTenantHeader(controllerContext.Request);
if (tenantIdentifier != null)
log4net.ThreadContext.Properties["tenantId"] = tenantIdentifier;
else
log4net.ThreadContext.Properties["tenantId"] = "default";
await SetTenantIdentifier(tenantIdentifier);
base.Initialize(controllerContext);
}

这个想法的问题在于,对我来说,setTenantId 需要等待,但我无法使初始化任务(异步(方法。

我最终在没有调用await的情况下解决了await SetTenantIdentifier(tenantIdentifier);,但它不起作用,Log4net.ThreadContext.Properties["tenantId"] = tenantIdentifier; 会在控制器日志上返回 null,但在基本控制器中工作(因为它在调用之间更改线程(

2018-05-10 13:59:21,289 (租户( [8] 信息 - 基本控制器 - 租户标识符设置为租户

2018-05-10 13:59:21,504 ((空(( [12] 信息 - 测试控制器 - 来自控制器的嗨

所以我用Log4net.LogicalThreadContext.Properties["tenantId"] = tenantIdentifier; 而不是Log4net.ThreadContext.Properties["tenantId"] = tenantIdentifier; 它起作用了。

编辑:我在这两行中都写了ThreadContext,但我的意思是我使用了LogicalThreadContext而不是ThreadContext。

最新更新