2013-03-28 58 views
1

我們使用的是NHibernate 3.2。Nhibernate - 對特定的ISession或ISessionFactory使用日誌記錄

我想能夠記錄來自特定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. 從NHibernate.SQL寫自己的ILoggerFactory實現
  2. 採集記錄的數據來捕獲所有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 
} 
+0

謝謝你的詳細解答,蘭迪。然而,我對這個解決方案有點謹慎,因爲這意味着這個記錄器將會在系統中的每個會話中執行,這將導致全局性能下降。是否沒有其他方式(例如沒有記錄)從特定會話中獲取完整的SQL? – VitalyB

+0

另外,如果你可以請看看這個,後續問題:http://stackoverflow.com/questions/15700406/getting-building-the-sql-with-parameters-from-nhibernate-3-2謝謝! – VitalyB

+1

@VitalyB不幸的是,我不知道有任何其他方式可以訪問完整的SQL查詢字符串和參數。是的,創建一個客戶ILoggerFactory將導致某種性能下降。我也看了你的後續問題,但我沒有其他任何貢獻,因爲我從來不需要做任何事情。祝你好運! –

相關問題