我在ASP.NET MVC 5中有一个多租户应用程序,可以接受来自多家公司的客户端登录。目前,我使用log4net登录文件,但它将所有公司的所有日志放在一个文件中。理想情况下,我想分离出日志文件,以便每个公司的日志都驻留在自己的文件夹中。
我从this question看到我可以以编程方式创建其他appender,然后可以登录到不同的日志文件。但这意味着对于每个类的实例,我将不得不继续调用
ILog log = LogManager.GetLogger("CompanyA");
获得正确的记录器,对吗?有没有更好的方法呢?如果需要,我也愿意使用另一台记录器。
感谢。
答案 0 :(得分:3)
您是否在应用程序中使用Ioc容器?我能够使用AutoFac MultitenantContainer解决类似的问题。您需要遵循的步骤
您的代码可能如下(摘自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();