1

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

それはうまくいくでしょうか?それとも別の方法がありますか?

4

1 に答える 1

4

いいえ、ロガーはグローバルにしか指定できません。あなたが望むことをするのはかなり複雑です。

次のことを行う必要があります。

  1. 独自の ILoggerFactory 実装を作成する
  2. NHibernate.SQL からログ データをキャプチャして、すべての SQL をキャプチャします。
  3. NHibernate.Impl.SessionImpl からログ データをキャプチャして、どの ISession と ISessionFactory が SQL を生成したかをキャプチャします。
  4. 指定した 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
}
于 2013-03-29T00:37:10.997 に答える