2012-01-18 8 views
0

NHibernateとlog4netを構成して、結果として得られるクエリのSQLを記録する方法を知っています。ただし、の特定のクエリのみをログに記録することはできますか(たとえば、LINQクエリの前にログアクティビティをアクティブにし、クエリの直後にログをアクティブにするなど)特定のNHibernate SQLクエリをログに記録する

答えて

2

log4netのインスタンスにアペンダーをプログラムで追加したり削除したりすることができます。つまり、ログに記録するクエリにヒットしたり、プログラムで新しいアペンダーを追加したり、クエリを実行したり、プログラムでアペンダーを削除したりすることができます。私はこれをテストしていないが、これが可能でなければならないと思う。

Here is a referenceアペンダーをプログラムで追加する方法です。

+0

ありがとうございます。あなたの意見では、特定の(複雑な)クエリだけを記録する正しい方法ですか? – StockBreak

+0

はい、これはやってみる方法です。プログラムで目的のログを有効にし、クエリを実行してからログをオフにできる必要があります。私はこの行に沿った何かがうまくいくと確信しています。しかし、私はこれを個人的にテストしていません。 –

+0

これにより、同時セッションのクエリが記録されます。しかし、OPがNHibernateビルトインロギングを使用したいのであれば、別の解決策が利用可能ではないと思います。 –

0

必要に応じて有効にするインターセプタを使用して、自分でSQLをログすることができます。セッションを開くとき

public class SqlLogInterceptor : EmptyInterceptor 
{ 
    private static readonly ILog _log = 
     LogManager.GetLogger(typeof(SqlLogInterceptor)); 

    public bool Enabled { get; set; } 

    public override SqlString OnPrepareStatement(SqlString sql) 
    { 
     // Adjust your log level as you see fit. 
     if (Enabled) 
      _log.Info(sql); 
     return sql; 
    }  
} 

は、OpenSessionにインターセプターのインスタンスを提供し、その上に参照を続けます。

ロギングが必要なときは、Enabledプロパティを設定します。 1つのセッションでインターセプタインスタンスを使用した場合、そのセッションSQLだけがログに記録されます。

パラメータ値はこのソリューションでは記録されません。

関連する問題