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

3
我有一个基于ASP.NET MVC 5的多租户应用程序,可以接受来自多个公司的客户端登录。目前,我正在使用log4net将日志记录到文件中,但它将所有公司的日志都放在一个文件中。理想情况下,我希望将日志文件分开,使每个公司的日志都驻留在自己的文件夹中。
这个问题中,我看到我可以编程方式创建其他附加器,然后可以将其日志记录到不同的日志文件中。但这意味着对于每个类的实例,我都必须不断调用。
ILog log = LogManager.GetLogger("CompanyA");

为了获取正确的记录器,应该怎么做?有更好的方法吗?如果需要,我也可以使用另一个记录器。

谢谢。

1个回答

3

你的应用程序中是否使用了Ioc容器?我曾经使用过AutoFac MultitenantContainer解决类似的问题。需要遵循以下步骤:

  1. 定义用于识别每个租户的策略。
  2. 使用Autofac容器注册通用记录器接口。
  3. 为每个租户注册特定的记录器。

你的代码可能如下所示(摘自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();

不,我现在没有使用IoC容器。将来我会研究AutoFac。有没有一种方法可以在没有它的情况下进行日志记录? - Ionian316
我可以考虑使用一个工厂来返回记录器。在工厂内部,根据请求URL返回记录器的逻辑将基于每个租户的特定URL。当我开始使用多租户应用程序时,我有一些对每个租户具体行为的要求,这些要求随着时间的推移而增加。如果您正在考虑将其实现为非功能性需求而不仅仅是用于日志记录,则建议查看Autofac。 - Kamalakar Nellipudi
哇,这太酷了。我正在使用Unity,但按租户进行操作并不是那么容易。 - Casey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接