我在 ASP.NET MVC 5 中有一个 Multi-Tenancy 应用程序,可以接受来自多个公司的客户端登录。目前,我使用 log4net 来记录文件,但它将所有公司的所有日志放在一个文件中。理想情况下,我想将日志文件分开,以便每个公司的日志都位于其自己的文件夹中。
我从this question看到我可以以编程方式创建额外的附加程序,然后它们可以记录到不同的日志文件。但这意味着对于类的每个实例,我必须继续调用
ILog log = LogManager.GetLogger("CompanyA");
获得正确的记录器,对吗?有更好的方法吗?如果需要的话,我也愿意使用其他记录器。
谢谢。
最佳答案
您在应用程序中使用 Ioc 容器吗?我能够使用 AutoFac MultitenantContainer 解决类似的问题。您需要遵循的步骤
- 定义用于识别每个租户的策略。
- 使用 Autofac 容器注册通用记录器接口(interface)
- 为每个租户注册特定的记录器。
您的代码可能如下所示(摘自 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/