Spring JDBC не регистрирует SQL с помощью log4j

Я исследую весну на предмет возможного перехода к пружинному стеку. Одной из вещей, которые я подумал, было круто, была возможность для Spring jdbc регистрировать все выполненные sql. Поэтому я вставил log4j, настроил файл log4j.properties. и нет sql.

вот файл log4j.properties:

log4j.appender.stdout=org.apache.log4j.ConsoleAppe nder
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.Patt ernLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug, stdout
log4j.category.org.springframework.jdbc.core=DEBUG

Вот вывод для действительно простой вставки SQL через Spring JDBC: http://pastie.org/713189

6 ответов

Попробуйте установить эти дополнительные log4j лесорубы. Первый выплюнет SQL, который проходит через пружины JdbcTemplateвторая дает вам значения параметров, которые Spring устанавливает для подготовленных операторов.

<logger name="org.springframework.jdbc.core.JdbcTemplate">
  <level value="debug" />
</logger>

<logger name="org.springframework.jdbc.core.StatementCreatorUtils">
  <level value="debug" />
</logger>

Очевидно, что это сработает, только если вы прямо или косвенно выполняете SQL с помощью JdbcTemplate,

Вы уверены, что это log4.properties что ваше приложение забирает? Я скопировал log4j.properties вы разместили в приложении Spring на моей локальной машине, и я получил кучу записей отладки Spring в дополнение к журналу JDBC. Я не вижу записей отладки в вашем выводе.

Несколько вероятных виновников для вашего log4j.properties не читаются правильно:

  • log4j.properties не в вашем классе Вы можете попытаться сделать class.getResource() на это, чтобы видеть, находит ли это это вообще.
  • Есть другой log4j.properties на вашем пути к классам.
  • Что-то заставляет обычную регистрацию использовать другой регистратор. Инструкции по включению диагностики общего пользования можно найти здесь.

Пытаться

log4j.category.org.springframework.jdbc.core = TRACE

Это помогло мне, DEBUG просто не хватило Я использую org.springframework.jdbc-3.0.6.RELEASE.jar с log4j-1.2.15 и slf4j (1.6.4)

Только для SQL (т.е. если вас не интересуют значения связанных параметров) DEBUG должно быть достаточно.

Насколько я понимаю, весна будет распечатывать информацию, когда вы используете подготовленное заявление.

Смотрите это обсуждение на форуме Spring.

Предполагая Spring 3.0.7.RELEASE и log4j 1.2.17, мы получили задачу, выполненную через:

 <!-- activates query logging -->
 <category name="org.springframework.jdbc.core.JdbcTemplate">
    <level value="DEBUG"/>
 </category>
<!-- activates parameter substitution logging -->
<category name="org.springframework.jdbc.core.StatementCreatorUtils">
    <level value="TRACE"/>
</category>

..в нашем log4j.xml.

Замена <category/> с <logger/> тоже работает отлично.

Как вы выполняете SQL? Spring не будет магически регистрировать SQL, который отправляется в базу данных, вы должны пройти через соответствующие каналы.

Например, если вы выполняете SQL с помощью JdbcTemplateлибо напрямую, либо через JdbcDaoSupportтогда да, SQL будет записываться для некоторых операций, но только для тех операций, которые связаны с прямым SQL.

Если вы используете Hibernate или подготовленные операторы, Spring никогда не увидит сам SQL и, следовательно, не сможет его записать.

Если вы разместите пример кода, демонстрирующий, как вы выполняете SQL, это очень поможет.

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