ASP.NET MVC应用程序中的多租户日志记录

时间:2014-05-19 20:48:19

标签: asp.net asp.net-mvc logging log4net multi-tenant

我在ASP.NET MVC 5中有一个多租户应用程序,可以接受来自多家公司的客户端登录。目前,我使用log4net登录文件,但它将所有公司的所有日志放在一个文件中。理想情况下,我想分离出日志文件,以便每个公司的日志都驻留在自己的文件夹中。

我从this question看到我可以以编程方式创建其他appender,然后可以登录到不同的日志文件。但这意味着对于每个类的实例,我将不得不继续调用

ILog log = LogManager.GetLogger("CompanyA");

获得正确的记录器,对吗?有没有更好的方法呢?如果需要,我也愿意使用另一台记录器。

感谢。

1 个答案:

答案 0 :(得分:3)

您是否在应用程序中使用Ioc容器?我能够使用AutoFac MultitenantContainer解决类似的问题。您需要遵循的步骤

  1. 定义用于识别每个租户的策略。
  2. 使用Autofac容器注册通用记录器界面
  3. 针对每个租户注册特定记录器。
  4. 您的代码可能如下(摘自Autofac wiki

        var tenantIdStrategy = new RequestParameterTenantIdentificationStrategy("tenant");
        var builder = new ContainerBuilder();
        builder.RegisterType<BaseDependency>().As<IDependency>();
    
        // If you have tenant-specific controllers in the same assembly as the
        // application, you should register controllers individually.
        builder.RegisterType<HomeController>();
    
        // Create the multitenant container and the tenant overrides.
        var mtc = new MultitenantContainer(tenantIdStrategy, builder.Build());
        mtc.ConfigureTenant("CompanyA",
           b =>
            {
              b.RegisterType<Tenant1Dependency>().As<IDependency>().InstancePerDependency();
              b.RegisterType<Tenant1Controller>().As<HomeController>();
            });
    

    如果这是您需要区分租户并且此时不想要Ioc的唯一实例,您可以创建像

    这样的工厂
    static class LogFactory
    {
        public static ILog GetLogger()
        {
            var requestUri = HttpContext.Current.Request.Url.AbsoluteUri;
            switch (requestUri)
            {
                case "companyA.domain.com":
                    return LogManager.GetLogger("CompanyA");
                case "companyB.domain.com":
                    return LogManager.GetLogger("CompanyB");
                default:
                    return LogManager.GetLogger("default");
            }
        }
    }
    

    现在使用工厂而不是直接使用Logmanager

     ILog logger = LogFactory.GetLogger();