1.查看nhibernate写在控制台里的sql语句
在配置文件中有这么个选项,假如把它设置为true,nhibernate会把执行的sql显示在控制台上。
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
<property name="show_sql">true</property>
对于控制台应用程序我们可以设置断点后很轻松的看到nhibernate执行了什么sql。
下图是从数据库中读取一条数据。
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOWpibUpzYjJkelgyTnZiUzl5Wlc1eVpXNXhjUzgxTnpZekwyOWZjMmh2ZDNOeGJHbHVZMjl1YzI5c1pTNXFjR2M9LmpwZw==)
假如你写了单元测试,从nunit同样可以很轻易地看到。
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOWpibUpzYjJkelgyTnZiUzl5Wlc1eVpXNXhjUzgxTnpZekwyOWZjMmh2ZDNOeGJHbHViblZ1YVhRdWFuQm4uanBn)
2.配置log4net来查看nhibernate留下的日志
假如你的程序是asp.net程序。那就看不到控制台信息了。那么就使用第二招配置log4net。
按习惯,我还是使用单独的配置文件。当然你也可以配置在应用程序配置文件中(app.config或web.config)。
读取log4net配置的代码
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
xmlconfigurator.configure(new fileinfo("log4net.cfg.xml"));
运行了程序后你可以在应用程序目录找到log.txt的配置文件。里面记录了包括sql的nhibernate的运行信息。
这是一个日志的片断
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:16,921 [2036] info nhibernate.cfg.environment [(null)] <(null)> - nhibernate 1.0.2
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:16,968 [2036] info nhibernate.cfg.environment [(null)] <(null)> - nhibernate section not found in application configuration file
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:16,968 [2036] info nhibernate.cfg.environment [(null)] <(null)> - using reflection optimizer
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,000 [2036] info nhibernate.cfg.configuration [(null)] <(null)> - searching for mapped documents in assembly: ddlly.mydoc.nhibernatetest.log4nettest
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
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
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,062 [2036] info nhibernate.dialect.dialect [(null)] <(null)> - using dialect: nhibernate.dialect.mssql2000dialect
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,109 [2036] info nhibernate.cfg.binder [(null)] <(null)> - mapping class: ddlly.mydoc.nhibernatetest.log4nettest.user -> users
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,156 [2036] info nhibernate.cfg.configuration [(null)] <(null)> - configured sessionfactory: ddlly.mydoc.nhibernatetest.log4nettest
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,171 [2036] info nhibernate.cfg.configuration [(null)] <(null)> - processing one-to-many association mappings
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,171 [2036] info nhibernate.cfg.configuration [(null)] <(null)> - processing one-to-one association property references
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,171 [2036] info nhibernate.cfg.configuration [(null)] <(null)> - processing foreign key constraints
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,187 [2036] info nhibernate.dialect.dialect [(null)] <(null)> - using dialect: nhibernate.dialect.mssql2000dialect
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,187 [2036] info nhibernate.cfg.settingsfactory [(null)] <(null)> - use outer join fetching: true
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,187 [2036] info nhibernate.connection.connectionproviderfactory [(null)] <(null)> - intitializing connection provider: nhibernate.connection.driverconnectionprovider
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,187 [2036] info nhibernate.connection.connectionprovider [(null)] <(null)> - configuring connectionprovider
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,187 [2036] info nhibernate.cfg.settingsfactory [(null)] <(null)> - optimize cache for minimal puts: false
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,203 [2036] info nhibernate.cfg.settingsfactory [(null)] <(null)> - echoing all sql to stdout
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
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}
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,203 [2036] info nhibernate.cfg.settingsfactory [(null)] <(null)> - cache provider: nhibernate.cache.hashtablecacheprovider
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,203 [2036] info nhibernate.cfg.configuration [(null)] <(null)> - instantiating and configuring caches
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,218 [2036] info nhibernate.impl.sessionfactoryimpl [(null)] <(null)> - building session factory
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
2006-08-08 22:22:17,812 [2036] info nhibernate.impl.sessionfactoryobjectfactory [(null)] <(null)> - factory name:ddlly.mydoc.nhibernatetest.log4nettest
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
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。
日志记录代码
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
ilog applicationinfolog=applicationinfolog = logmanager.getlogger("applicationinfolog");
![NHibernate的调试技巧和Log4Net配置 NHibernate的调试技巧和Log4Net配置](/default/index/img?u=aHR0cHM6Ly9iYnNtYXguaWthZmFuLmNvbS9zdGF0aWMvTDNCeWIzaDVMMmgwZEhCekwybHRZV2RsY3k1amJtSnNiMmR6TG1OdmJTOXZkWFJzYVc1cGJtZHBibVJwWTJGMGIzSnpMMjV2Ym1VdVoybG0uanBn)
applicationinfolog.info("记录日志");
此例中nhibernater日志会存在log.txt,系统日志记录在log1.txt。
4.在使用sqlserver时使用事件查看器监视sql
对于sqlserver数据库,假如你没有条件可以完成上面的功能,那么你可以使用事件查看器来监视执行的sql,使用比较简单,不多说了。