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, это очень поможет.