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

时间:2018-05-09 08:24:00

标签: c# asp.net-web-api log4net multi-tenant

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

  

2018-05-09 11:06:00,490((tenantId))[12] INFO方法名称 - 日志

     

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

我解决这个问题的想法是使用

手动添加tenantId
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需要等待,但我无法初始化任务(异步)方法。

1 个答案:

答案 0 :(得分:0)

我最终在不调用args=(1, 2) x=1, y=2 arg_dict[0]=(1, 2) args=((1, 2),) Traceback (most recent call last): File "c:\Users\name\Documents\pname\test.py", line 28, in <module> myfun(arg_dict[0]) File "c:\Users\name\Documents\pname\test.py", line 21, in myfun x, y = args ValueError: not enough values to unpack (expected 2, got 1) 的情况下解析await SetTenantIdentifier(tenantIdentifier);,但它不起作用,await将在控制器日志上返回null但在基本控制器中工作(因为它正在改变调用之间的线程)

  

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

     

2018-05-10 13:59:21,504((null))[12] INFO    - 测试控制器 - 来自控制器的嗨

所以我使用了Log4net.ThreadContext.Properties["tenantId"] = tenantIdentifier; 而不是Log4net.LogicalThreadContext.Properties["tenantId"] = tenantIdentifier; ,而且效果很好。

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