如何为每个SessionFactory单独配置log4net?

时间:2017-12-21 08:37:47

标签: c# logging nhibernate log4net

我的应用程序使用两个数据库。显然,每个数据库都有一个会话工厂;总共两个。

我为NHibernate配置了log4net以发出生成的SQL。但是,这会将两个会话工厂的日志写入单个文件中。我想为每个会话工厂配置不同的日志文件。

以下是我的代码:

Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders();

FileAppender fileAppender = new FileAppender();
fileAppender.Name = "NHFileAppender";
fileAppender.File = logFilePath;
fileAppender.AppendToFile = false;
fileAppender.LockingModel = new FileAppender.MinimalLock();
fileAppender.Layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss}:%m%n%n");
fileAppender.ActivateOptions();

Logger logger = hierarchy.GetLogger("NHibernate.SQL") as Logger;
logger.Additivity = false;
logger.Level = Level.Debug;
logger.AddAppender(fileAppender);

hierarchy.Configured = true;

正如您在上面的代码中看到的,没有任何方法可以为每个会话工厂配置不同的日志文件。如果我正确理解这一点,应该有一种方法将会话工厂链接/分配给记录器或记录器到会话工厂。

这可能吗?如果是,怎么样?

1 个答案:

答案 0 :(得分:0)

@RomanKoliada为commented,从here复制以下内容:

  

在Visual Studio输出窗口中记录NHibernate
  在ASP.NET MVC 4中工作时,NHibernate 'show_sql=true'不会将生成的查询记录到Visual Studio的输出窗口。   我做了一个简单的实现,用于在Visual Studio的输出窗口中记录NHibernate查询,而不使用第三方记录器。

     

创建一个拦截器类,并覆盖一个方法   查看sourceprint?

public class NHLogger : EmptyInterceptor, IInterceptor
{
    public override NHibernate.SqlCommand.SqlString 
       OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
    {
        System.Diagnostics.Debug.WriteLine("NHIBERNATE: " +  sql);
        return base.OnPrepareStatement(sql);
    }
}
     

然后在Factory的OpenSession中创建它的实例。

 SessionFactory.OpenSession(new NHLogger());

这不是我所需要的;但比我已经使用的更好。我仍然愿意接受更好的解决方案。