asp.net - ASP.NET MVC 应用程序中的 Multi-Tenancy 日志记录

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

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

我从this question看到我可以以编程方式创建额外的附加程序,然后它们可以记录到不同的日志文件。但这意味着对于类的每个实例,我必须继续调用

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

获得正确的记录器,对吗?有更好的方法吗?如果需要的话,我也愿意使用其他记录器。

谢谢。

最佳答案

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

  1. 定义用于识别每个租户的策略。
  2. 使用 Autofac 容器注册通用记录器接口(interface)
  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();

关于asp.net - ASP.NET MVC 应用程序中的 Multi-Tenancy 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23746946/

相关文章:

python - Loguru:如何混淆日志中的数据

java.util.logging XMLFormatter 架构?

c# - 获取 ASP.NET 项目中可用的命名空间列表

asp.net-mvc - 无法在 asp.net mvc 中使用资源文件进行本地化

c# - 在什么场景下我们需要创建一个新的线程?

asp.net-mvc - MVC 按钮单击在新窗口中打开

asp.net - 在 JavaScript 代码中嵌入常量服务器端标签的最佳方法是什么?

java - hadoop 覆盖每个作业的 log4j.properties

javascript - 如何根据迭代次数获取控件?

c# - 为特定 Controller 操作选择自定义输出缓存提供程序