Nhibernate - 使用特定ISession或ISessionFactory的日志记录

时间:2013-03-28 19:07:44

标签: nhibernate

我们正在使用NHibernate 3.2。

我希望能够从特定的ISession记录SQL查询。这可能吗?

或者,如果不可能,我可以将记录器设置为特定的ISessionFactory吗?然后我可以从这个特定的工厂创建这个ISession。

从我看到的,设置记录器,你必须做这样的事情:

<appSettings>
       <add key="nhibernate-logger" value="NH3SQLLogger.LoggerFactory, NH3SQLLogger" />
</appSettings>    

然而,这将使所有工厂的设置全局化。

我能做那样的事吗:

        var config = new Configuration();
        config.Configure();
        config.SetProperty("nhibernate-logger",
                       "NH3SQLLogger.LoggerFactory, NH3SQLLogger");
        _sessionFactory = config.BuildSessionFactory();

那会有用吗?或者还有另一种方式吗?

1 个答案:

答案 0 :(得分:4)

不,您只能全局指定记录器。做你想做的事情会相当复杂。

你需要:

  1. 编写自己的ILoggerFactory实现
  2. 从NHibernate.SQL捕获日志数据以捕获所有SQL
  3. 从NHibernate.Impl.SessionImpl捕获日志记录数据,以捕获哪个ISession和ISessionFactory生成了SQL。
  4. 编写逻辑以忽略除了由命名的ISessionFactory生成的所有SQL。
  5. 以下是一些可以帮助您入门的代码:

    public class LoggerFactory : ILoggerFactory
    {
        #region Implementation of ILoggerFactory
    
        /// <summary>
        /// Returns the logger for a given key name
        /// </summary>
        /// <param name="keyName">Key or class name</param>
        /// <returns>Logger</returns>
        public IInternalLogger LoggerFor( string keyName )
        {
            if ( string.IsNullOrWhiteSpace( keyName ) )
                return new NoLoggingInternalLogger();
    
            switch ( keyName )
            {
                case "NHibernate.SQL":
                    return new SqlLogger(); // Create this class to capture the SQL
                case "NHibernate.Impl.SessionImpl":
                    return new SessionLogger(); // Create this class to capture ISession-related stuff
                default:
                    return new NoLoggingInternalLogger();
            }
        }
    
        /// <summary>
        /// Returns the logger for a given type
        /// </summary>
        /// <param name="type">Class name</param>
        /// <returns>Logger</returns>
        public IInternalLogger LoggerFor( Type type )
        {
            return LoggerFor( type.FullName );
        }
    
        #endregion Implementation of ILoggerFactory
    }