我正在尝试让Castle ActiveRecord向我展示它生成的SQL。我在此发现的各种博客提供了两种选择:
(1)使用NHibernate“show_sql”设置。麻烦的是,我正在使用程序化配置,就像这样。
var config = XmlConfigurationSource.Build(
DatabaseType.MsSqlServer2008, Settings.Default.StationManagerDbConnectionString);
config.IsRunningInWebApp = isRunningInWebApp;
config.PluralizeTableNames = true;
var modelAssembly = Assembly.GetAssembly(typeof(OneOfMyClasses));
ActiveRecordStarter.Initialize(modelAssembly, config);
使用编程配置,似乎没有办法指定“show_sql”。
(2)使用log4net 。但是除了令人痛苦的log4net工作之外,我还没有办法让只是 SQL。我得到了大量的调试数据,其中SQL语句只是其中的一小部分。
那么:有没有什么方法可以保留我的Castle ActiveRecord的编程配置,还能让NHibernate只输出SQL?
编辑:这是我使用log4net的原因。但是在我的Web应用程序的前两页中,这会在Debug窗口中吐出超过14,000行。如何更改此代码以仅获取SQL?
var appender = new log4net.Appender.DebugAppender
{
Layout = new log4net.Layout.SimpleLayout(),
Name = "NHibernate.SQL",
Threshold = log4net.Core.Level.Debug
};
log4net.Config.BasicConfigurator.Configure(appender);
答案 0 :(得分:1)
您应该能够通过使用 NHibernate.SQL 记录器来分离出SQL。
示例配置:
<log4net>
<!-- This is a default logger that nhibernate uses to push out all the SQL statements to-->
<logger name="NHibernate.SQL" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="NHibernateSQLLog"/>
</logger>
<!-- This is a default logger that nhibernate uses to push out all the debugging type information to-->
<logger name="NHibernate" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="NHibernateFileLog"/>
</logger>
<appender name="NHibernateFileLog" type="log4net.Appender.RollingFileAppender">
<file value="Logs/nhibernate.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n" />
</layout>
</appender>
<appender name="NHibernateSQLLog" type="log4net.Appender.RollingFileAppender">
<file value="Logs/nhibernate_sql.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n" />
</layout>
</appender>
</log4net>
修改:
var filter = new log4net.Filter.LoggerMatchFilter();
filter.LoggerToMatch = "NHibernate.SQL";
filter.AcceptOnMatch = true;
var filterDeny = new log4net.Filter.DenyAllFilter();
var appender = new log4net.Appender.DebugAppender
{
Layout = new log4net.Layout.SimpleLayout(),
Name = "NHibernate.SQL",
Threshold = log4net.Core.Level.Debug
};
appender.AddFilter(filter);
appender.AddFilter(filterDeny);
log4net.Config.BasicConfigurator.Configure(appender);
答案 1 :(得分:0)
该任务的最佳工具是NHibernate Profiler(http://nhprof.com/)。 这是一个商业应用程序,但你可以免费试用30天。