所以我的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。