Замок ActiveRecord: Какой самый простой способ увидеть SQL?
Я пытаюсь заставить Castle ActiveRecord показать мне SQL, который он генерирует. Различные блоги, которые я нашел по этому вопросу, дают две альтернативы:
(1) Используйте настройку "show_sql" NHibernate. Проблема в том, что я использую программную настройку, вот так.
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. Но на первых двух страницах моего веб-приложения в окне "Отладка" выпадает более 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);
2 ответа
Вы должны иметь возможность просто отделить sql, используя регистратор NHibernate.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);
Самый лучший инструмент для этой задачи - NHibernate Profiler ( http://nhprof.com/). Это коммерческое приложение, но вы получаете 30-дневную бесплатную пробную версию.