Замок 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-дневную бесплатную пробную версию.

Другие вопросы по тегам