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

Nhibernate-使用特定ISession或ISessionFactory的日志记录,nhibernate,Nhibernate,我们使用的是NHibernate 3.2 我希望能够记录来自特定ISession的SQL查询。可能吗 或者,如果不可能,我可以将记录器设置为特定的ISessionFactory吗?然后我可以从这个特定的工厂创建这个会话 据我所见,要设置记录器,必须执行以下操作: <appSettings> <add key="nhibernate-logger" value="NH3SQLLogger.LoggerFactory, NH3SQLLogger" /> <

我们使用的是NHibernate 3.2

我希望能够记录来自特定ISession的SQL查询。可能吗

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

据我所见,要设置记录器,必须执行以下操作:

<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();

这样行吗?或者有其他方法吗?

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

您需要:

编写自己的iLogger工厂实现 从NHibernate.SQL捕获日志数据以捕获所有SQL 从NHibernate.Impl.SessionImpl捕获日志数据,以捕获哪个ISession和ISessionFactory生成了SQL。 将逻辑编码为忽略所有SQL,但由命名的ISessionFactory生成的SQL除外。 以下是一些让您开始学习的代码:

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
}

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

您需要:

编写自己的iLogger工厂实现 从NHibernate.SQL捕获日志数据以捕获所有SQL 从NHibernate.Impl.SessionImpl捕获日志数据,以捕获哪个ISession和ISessionFactory生成了SQL。 将逻辑编码为忽略所有SQL,但由命名的ISessionFactory生成的SQL除外。 以下是一些让您开始学习的代码:

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
}

谢谢你的详细回答,兰迪。但是,我对这个解决方案有点担心,因为这意味着这个记录器将对系统中的每个会话执行,这将导致全局性能下降。是否没有其他方法(例如不进行日志记录)可以从特定会话获取完整的SQL?另外,如果可以,请看一下下面的问题:谢谢@不幸的是,我不知道有任何其他方法可以访问完整的SQL查询字符串和参数。是的,创建一个客户工厂将导致某种性能下降。我也看了你的后续问题,但我没有任何其他贡献,因为我从来没有做过类似的事情。祝你好运!谢谢你的详细回答,兰迪。但是,我对这个解决方案有点担心,因为这意味着这个记录器将对系统中的每个会话执行,这将导致全局性能下降。是否没有其他方法(例如不进行日志记录)可以从特定会话获取完整的SQL?另外,如果可以,请看一下下面的问题:谢谢@不幸的是,我不知道有任何其他方法可以访问完整的SQL查询字符串和参数。是的,创建一个客户工厂将导致某种性能下降。我也看了你的后续问题,但我没有任何其他贡献,因为我从来没有做过类似的事情。祝你好运!