NHibernate的調試技巧和Log4Net配置

對新手而言NHibernate的調試事件很痛苦的事情,不知道NHibernate做了些什麼,錯誤出現在什麼地方。

我給出一些常用的調試辦法希望對你有所幫助。

 

1.查看NHibernate寫在控制檯裏的Sql語句

在配置文件中有這麼個選項,如果把它設置爲true,NHibernate會把執行的Sql顯示在控制檯上。

<property name="show_sql">true</property> 

對於控制檯應用程序我們可以設置斷點後很輕鬆的看到NHibernate執行了什麼Sql。

下圖是從數據庫中讀取一條數據。


如果你寫了單元測試,從NUnit同樣可以很容易地看到。

 

2.配置Log4net來查看NHibernate留下的日誌

如果你的程序是Asp.Net程序。那就看不到控制檯信息了。那麼就使用第二招配置Log4net。

按習慣,我還是使用單獨的配置文件。當然你也可以配置在應用程序配置文件中(App.config或Web.Config)。

<?xml version="1.0" encoding="utf-8" ?>
  
<log4net>

    
<appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net" >

      
<param name="File" value="log.txt" />
      
<param name="AppendToFile" value="false" />
      
<param name="RollingStyle" value="Date" />
      
<param name="DatePattern" value="yyyy.MM.dd" />
      
<param name="StaticLogFileName" value="true" />

      
<layout type="log4net.Layout.PatternLayout,log4net">
        
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n" />
      
</layout>
    
</appender>

    
<root>
      
<!--如果只需要看看Sql設置INFO就夠了,如果你要調試可以設置爲DEBUG或ALL-->
      
<priority value="INFO" />
      
<appender-ref ref="rollingFile" />
    
</root>

  
</log4net>



讀取log4net配置的代碼

XmlConfigurator.Configure(new FileInfo("log4net.cfg.xml"));

運行了程序後你可以在應用程序目錄找到log.txt的配置文件。裏面記錄了包括Sql的NHibernate的運行信息。

這是一個日誌的片斷

2006-08-08 22:22:16,921 [2036] INFO NHibernate.Cfg.Environment [(null)] <(null)> - NHibernate 1.0.2
2006-08-08 22:22:16,968 [2036] INFO NHibernate.Cfg.Environment [(null)] <(null)> - nhibernate section not found in application configuration file
2006-08-08 22:22:16,968 [2036] INFO NHibernate.Cfg.Environment [(null)] <(null)> - Using reflection optimizer
2006-08-08 22:22:17,000 [2036] INFO NHibernate.Cfg.Configuration [(null)] <(null)> - Searching for mapped documents in assembly: DDLLY.MyDoc.NHibernateTest.Log4NetTest
2006-08-08 22:22:17,000 [2036] INFO NHibernate.Cfg.Configuration [(null)] <(null)> - Found mapping documents in assembly: DDLLY.MyDoc.NHibernateTest.Log4NetTest.User.hbm.xml
2006-08-08 22:22:17,062 [2036] INFO NHibernate.Dialect.Dialect [(null)] <(null)> - Using dialect: NHibernate.Dialect.MsSql2000Dialect
2006-08-08 22:22:17,109 [2036] INFO NHibernate.Cfg.Binder [(null)] <(null)> - Mapping class: DDLLY.MyDoc.NHibernateTest.Log4NetTest.User -> users
2006-08-08 22:22:17,156 [2036] INFO NHibernate.Cfg.Configuration [(null)] <(null)> - Configured SessionFactory: DDLLY.MyDoc.NHibernateTest.Log4NetTest
2006-08-08 22:22:17,171 [2036] INFO NHibernate.Cfg.Configuration [(null)] <(null)> - processing one-to-many association mappings
2006-08-08 22:22:17,171 [2036] INFO NHibernate.Cfg.Configuration [(null)] <(null)> - processing one-to-one association property references
2006-08-08 22:22:17,171 [2036] INFO NHibernate.Cfg.Configuration [(null)] <(null)> - processing foreign key constraints
2006-08-08 22:22:17,187 [2036] INFO NHibernate.Dialect.Dialect [(null)] <(null)> - Using dialect: NHibernate.Dialect.MsSql2000Dialect
2006-08-08 22:22:17,187 [2036] INFO NHibernate.Cfg.SettingsFactory [(null)] <(null)> - use outer join fetching: True
2006-08-08 22:22:17,187 [2036] INFO NHibernate.Connection.ConnectionProviderFactory [(null)] <(null)> - Intitializing connection provider: NHibernate.Connection.DriverConnectionProvider
2006-08-08 22:22:17,187 [2036] INFO NHibernate.Connection.ConnectionProvider [(null)] <(null)> - Configuring ConnectionProvider
2006-08-08 22:22:17,187 [2036] INFO NHibernate.Cfg.SettingsFactory [(null)] <(null)> - Optimize cache for minimal puts: False
2006-08-08 22:22:17,203 [2036] INFO NHibernate.Cfg.SettingsFactory [(null)] <(null)> - echoing all SQL to stdout
2006-08-08 22:22:17,203 [2036] INFO NHibernate.Cfg.SettingsFactory [(null)] <(null)> - Query language substitutions: {false=0, no='N', yes='Y', true=1}
2006-08-08 22:22:17,203 [2036] INFO NHibernate.Cfg.SettingsFactory [(null)] <(null)> - cache provider: NHibernate.Cache.HashtableCacheProvider
2006-08-08 22:22:17,203 [2036] INFO NHibernate.Cfg.Configuration [(null)] <(null)> - instantiating and configuring caches
2006-08-08 22:22:17,218 [2036] INFO NHibernate.Impl.SessionFactoryImpl [(null)] <(null)> - building session factory
2006-08-08 22:22:17,812 [2036] INFO NHibernate.Impl.SessionFactoryObjectFactory [(null)] <(null)> - Factory name:DDLLY.MyDoc.NHibernateTest.Log4NetTest
2006-08-08 22:22:17,859 [2036] INFO NHibernate.Loader.Loader [(null)] <(null)> - SELECT user0_.Id as Id0_, user0_.Email as Email0_, user0_.UserName as UserName0_, user0_.Password as Password0_ FROM users user0_ WHERE user0_.Id=@p0


從這個文件我們可以看到NHibernate都做了些什麼(包括執行了什麼Sql,看上面的最後一行)。

當你想更詳細的信息可以把priority設置爲ALL,這樣可以看到所有信息。

提示:NHibernate會把一般信息記錄爲INFO,調試信息記錄爲Debug,錯誤信息記錄爲Error。

Log4Net中支持多個appender你可以也把日誌記錄到數據庫等其他地方,請參看Log4Net的文檔,這裏不做講解。

 

3.讓NHibernate的日誌不影響你使用Log4Net寫日誌

NHibernate總是會調用配置<root>裏面的“appender-ref”來寫配置。

所以如果你係統本省也使用了Log4Net記錄日誌,而不想讓NHibernate的日誌影響,則可以定義logger。

<?xml version="1.0" encoding="utf-8" ?>
  
<log4net>

    
<root>
      
<!--如果只需要看看Sql設置INFO就夠了,如果你要調試可以設置爲DEBUG或ALL-->
      
<priority value="INFO" />
      
<appender-ref ref="rollingFile" />
    
</root>

    
<logger name="ApplicationInfoLog">
      
<level value="INFO" />
      
<appender-ref ref="rollingFile1" />
    
</logger>

    
<appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net" >

      
<param name="File" value="log.txt" />
      
<param name="AppendToFile" value="false" />
      
<param name="RollingStyle" value="Date" />
      
<param name="DatePattern" value="yyyy.MM.dd" />
      
<param name="StaticLogFileName" value="true" />

      
<layout type="log4net.Layout.PatternLayout,log4net">
        
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n" />
      
</layout>
    
</appender>

    
<appender name="rollingFile1" type="log4net.Appender.RollingFileAppender,log4net" >

      
<param name="File" value="log1.txt" />
      
<param name="AppendToFile" value="false" />
      
<param name="RollingStyle" value="Date" />
      
<param name="DatePattern" value="yyyy.MM.dd" />
      
<param name="StaticLogFileName" value="true" />

      
<layout type="log4net.Layout.PatternLayout,log4net">
        
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n" />
      
</layout>
    
</appender>

  
</log4net>

日誌記錄代碼

ILog applicationInfoLog=applicationInfoLog = LogManager.GetLogger("ApplicationInfoLog");
applicationInfoLog.Info(
"記錄日誌");

此例中NHibernater日誌會存在log.txt,系統日誌記錄在log1.txt。

 

 

4.在使用SqlServer時使用事件查看器監視Sql

對於SqlServer數據庫,如果你沒有條件可以完成上面的功能,那麼你可以使用事件查看器來監視執行的Sql,使用比較簡單,不多說了。

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章