Это полезно Но это не показывает мне реальные запросы SQL.
Николас Барбулеско
6
@Nicolas, это правда, однако сразу после запроса он отображает связанные параметры.
экстремальный байкер
2
Я использую Grails 2.4.4 и Hibernate 4. Изменение конфигурации log4j у меня не сработало, но сработал p6spy!
Чемпион
11
В Hibernate 5 мы можем использовать org.hibernate.type.descriptor.sql.BasicBinderрегистратор. Включение входа в систему org.hibernate.typeнапечатало слишком много бесполезной информации для меня ...
csharpfolk
5
org.hibernate.typeи org.hibernate.loader.hqlне работать у меня, чтобы показать параметры
Дерик
75
Просто для удобства вот тот же пример конфигурации для Logback (SLF4J)
Log4JDBC - хорошее решение, которое печатает точное SQL, идущий в базу данных с параметрами, а не самый популярный ответ, который не делает этого. Одним из основных преимуществ этого является то, что вы можете копировать SQL прямо в интерфейс DB и выполнять как есть.
Мой файл конфигурации logback.xml выглядит следующим образом: здесь выводятся все операторы SQL с параметрами плюс таблицы наборов результатов для всех запросов.
<?xml version="1.0" encoding="UTF-8"?><configuration><appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern></encoder></appender><loggername="jdbc.audit"level="ERROR"/><loggername="jdbc.connection"level="ERROR"/><loggername="jdbc.sqltiming"level="ERROR"/><loggername="jdbc.resultset"level="ERROR"/><!-- UNCOMMENT THE BELOW TO HIDE THE RESULT SET TABLE OUTPUT --><!--<logger name="jdbc.resultsettable" level="ERROR" /> --><rootlevel="debug"><appender-refref="STDOUT"/></root></configuration>
Наконец, мне пришлось создать файл с именем log4jdbc.log4j2.properties в корне пути к классам, например, src / test / resources или src / main / resources в проекте Mevn. Этот файл имеет одну строку, которая ниже:
10:44:29.400[main] DEBUG jdbc.sqlonly - org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)5.select memberrole0_.member_id as member_i2_12_0_, memberrole0_.id as id1_12_0_, memberrole0_.id
as id1_12_1_, memberrole0_.member_id as member_i2_12_1_, memberrole0_.role_id as role_id3_12_1_,
role1_.id as id1_17_2_, role1_.name as name2_17_2_ from member_roles memberrole0_ left outer
join roles role1_ on memberrole0_.role_id=role1_.id where memberrole0_.member_id=10410:44:29.402[main] INFO jdbc.resultsettable -|----------|---|---|----------|--------|---|-----||member_id |id |id |member_id |role_id |id |name ||----------|---|---|----------|--------|---|-----||----------|---|---|----------|--------|---|-----|
Эй .... Это кажется классным .... только то, что доктор прописал для меня :) ... но поддерживает ли оно также CLOB / BLOB ?? Также возможно ли отображать только запрос, а не набор результатов. - Спасибо :)
Dev Ray
1
Не могли бы вы дать мне пример конфигурации, как это сделать?
grep
На самом деле, последний выводит табличное представление результатов запроса ... т.е. для этой замечательной функции нужен log4jdbc-remix.
меритон
Это решение было лучшим для моей ситуации, когда мне нужно было видеть значения номеров строк, которые Hibernate генерирует для наборов результатов подкачки. В журнале трассировки отображаются только значения параметров запроса.
org.hibernate.type.descriptor.sql.BasicBinderКатегория не включает в себя все параметры, например перечисления типов. Так что если вы хотите всего, вам действительно нужно TRACEдля всей org.hibernate.typeгруппы.
seanf
Для меня это работает в Hibernate 4.3! Кроме того, я бы не отслеживал полный org.hibernate.type, потому что это слишком много. В большинстве случаев это решение подойдет.
cslotty
Обратите внимание, что org.hibernate.type.descriptor.sql.BasicExtractor регистрирует наборы результатов. Поэтому наличие записи большого размера может даже привести к сбою приложения при входе в консоль в Eclipse, и я полагаю, что это также не идеально для входа в файл. Вот почему я предпочитаю это решение, оно работает также в Hibernate 3. Для тех, кто интересуется типами enum, пожалуйста, попробуйте точный класс, который регистрирует их, когда org.hibernate.type = TRACE. Затем установите org.hibernate.type.xyz.TheClassThatLogsEnumParams = TRACE.
Предполагая, что ваше приложение ожидает dataSourcebean-компонент (например, через @Resource), вы можете настроить его следующим образом datasource-proxy:
Решение верное, но также регистрируются все привязки для объектов результата. Чтобы предотвратить это, можно создать отдельное приложение и включить фильтрацию, например:
<!-- A time/date based rolling appender --><appendername="FILE_HIBERNATE"class="org.jboss.logging.appender.DailyRollingFileAppender"><errorHandlerclass="org.jboss.logging.util.OnlyOnceErrorHandler"/><paramname="File"value="${jboss.server.log.dir}/hiber.log"/><paramname="Append"value="false"/><paramname="Threshold"value="TRACE"/><!-- Rollover at midnight each day --><paramname="DatePattern"value="'.'yyyy-MM-dd"/><layoutclass="org.apache.log4j.PatternLayout"><!-- The default pattern: Date Priority [Category] Message\n --><paramname="ConversionPattern"value="%d %-5p [%c] %m%n"/></layout><filterclass="org.apache.log4j.varia.StringMatchFilter"><paramname="StringToMatch"value="bind"/><paramname="AcceptOnMatch"value="true"/></filter><filterclass="org.apache.log4j.varia.StringMatchFilter"><paramname="StringToMatch"value="select"/><paramname="AcceptOnMatch"value="true"/></filter><filterclass="org.apache.log4j.varia.DenyAllFilter"/></appender><categoryname="org.hibernate.type"><priorityvalue="TRACE"/></category><loggername="org.hibernate.type"><levelvalue="TRACE"/><appender-refref="FILE_HIBERNATE"/></logger><loggername="org.hibernate.SQL"><levelvalue="TRACE"/><appender-refref="FILE_HIBERNATE"/></logger>
**If you want hibernate to print generated sql queries with real values instead of question marks.****add following entry in hibernate.cfg.xml/hibernate.properties:**
show_sql=true
format_sql=true
use_sql_comments=true**Andadd following entry in log4j.properties :**
log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout
Эй, сингл31, указанный выше, должен быть добавлен в ваш файл конфигурации Hibernate, тогда он определенно будет работать. Я всегда публикую то, что я сделал практически.
Виджай Бхатт
3
Этот ответ немного отклоняется от вопроса. Иногда нам нужно только sql только для целей отладки во время выполнения. В этом случае есть более простой способ, используя отладку в редакторах.
Поместите точку останова в org.hibernate.loader.Loader.loadEntityBatch (или перемещайтесь по стеку до тех пор);
Когда выполнение приостановлено, посмотрите значение переменной this.sql;
Это для hibernate 3. Я не уверен, что это работает на других версиях.
Драйвер mysql jdbc уже предоставил удобный для удовлетворения этого требования, вы должны по крайней мере иметь версию jar> = mysql-connect-jar-5.1.6.jar
Шаг 1: [сконфигурируйте свой jdbc.url, чтобы добавить регистратор и пользовательский журнал]
Теперь он использует ведение журнала slf4j. Если по умолчанию ведется запись в журнал log4j, вы должны добавить зависимости slf4j-api, slf4j-log4j12, чтобы использовать ведение журнала slf4j.
шаг 2: [напишите свою собственную регистрацию]
package com.xxx;import java.sql.SQLException;import java.util.Properties;import com.mysql.jdbc.Connection;import com.mysql.jdbc.log.Log;publicclassCustomLoggingProfilerEventHandlerimplementsProfilerEventHandler{privateLog log;publicLoggingProfilerEventHandler(){}publicvoid consumeEvent(ProfilerEvent evt){/**
* you can only print the sql as this.log.logInfo(evt.getMessage())
* you can adjust your sql print log level with: DEBUG,INFO
* you can also handle the message to meet your requirement
*/this.log.logInfo(evt);}publicvoid destroy(){this.log =null;}publicvoid init(Connection conn,Properties props)throwsSQLException{this.log = conn.getLog();}}
Эй, это мило. Но я думаю, что здесь вопросы печатаются с? затем следуют значения параметров. Поскольку у меня бесконечно много запросов, мне нужно что-то, что я могу просто скопировать и вставить в редактор SQL, и они будут выполнены. Есть ли способ, которым я могу сделать это, используя этот подход. Я не очень хочу идти на сторонние библиотеки. Спасибо :)
Dev Ray
Спасибо. Я надеялся, что мне не придется использовать какие-либо сторонние решения и переходить в спящий режим напрямую, но, думаю, у меня нет другого выбора.
Dev Ray
2
Ведение журнала работает, но не совсем то, что вы хотите или я хотел некоторое время назад, но P6Spy работает отлично ,
Изменить файл свойств P6Spy
Изменить файл свойств P6Spy -spy.properties
Замените real driverсуществующим драйвером MySQL JDBC
realdriver=com.mysql.jdbc.Driver#specifies another driver to use
realdriver2=#specifies a third driver to use
realdriver3=
Измените расположение файла журнала. Измените расположение файла журнала в свойстве файла журнала, все операторы SQL будут входить в этот файл.
Windows
logfile = c:/spy.log
* Никс
logfile =/srv/log/spy.log
Скопировать “spy.properties”в classpath проекта
Скопируйте “spy.properties”в корневую папку вашего проекта, убедитесь, что ваш проект может найти «spy.properties», иначе он предложит “spy.properties”файлу не найденное исключение.
Это был самый простой путь для меня в моем приложении Spring Boot, где я пытался записать SQL, сгенерированный из модульного теста. Я добавил тестовую зависимость в Gradle (testCompile 'p6spy: p6spy: 3.8.5'), настроил application.yml, чтобы установить spring.datasource.url = jdbc: p6spy: h2: mem: testdb и spring.datasource.driver-class- name = com.p6spy.engine.spy.P6SpyDriver, а затем добавил spy.properties с realdriver = org.h2.Driver и лог-файлом, установленным по моему предпочтительному пути. Было легко извлечь полный SQL из полученного файла журнала. Единственный сбой в том, что H2 не понравился сгенерированный формат отметки времени.
Через эту ветку я узнал, что фреймворк jboss-logging, используемый hibernate, необходимо настроить для входа в систему через slf4j. Я добавил следующий аргумент к аргументам виртуальной машины приложения:
2013-10-3114:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] HQL:select noti.id, noti.idmicrosite, noti.fcaducidad, noti.fpublicacion, noti.tipo, noti.imagen, noti.visible, trad.titulo, trad.subtitulo, trad.laurl, trad.urlnom, trad.fuente, trad.texto from org.ibit.rol.sac.micromodel.Noticia noti join noti.traducciones trad where index(trad)='ca'and noti.visible='S'and noti.idmicrosite=985and noti.tipo=34462013-10-3114:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] SQL:select noticia0_.NOT_CODI as x0_0_, noticia0_.NOT_MICCOD as x1_0_, noticia0_.NOT_CADUCA as x2_0_, noticia0_.NOT_PUBLIC as x3_0_, noticia0_.NOT_TIPO as x4_0_, noticia0_.NOT_IMAGEN as x5_0_, noticia0_.NOT_VISIB as x6_0_, traduccion1_.NID_TITULO as x7_0_, traduccion1_.NID_SUBTIT as x8_0_, traduccion1_.NID_URL as x9_0_, traduccion1_.NID_URLNOM as x10_0_, traduccion1_.NID_FUENTE as x11_0_, traduccion1_.NID_TEXTO as x12_0_ from GUS_NOTICS noticia0_ inner join GUS_NOTIDI traduccion1_ on noticia0_.NOT_CODI=traduccion1_.NID_NOTCOD where(traduccion1_.NID_CODIDI='ca')and(noticia0_.NOT_VISIB='S')and(noticia0_.NOT_MICCOD=985)and(noticia0_.NOT_TIPO=3446)
Эй ... Я не могу найти никаких примеров такого подхода. Не могли бы вы предоставить какие-либо ссылки / примеры / учебники. И это все еще то же самое с последними версиями или hibernate / log4j, или он стал каким-то org.hibernate.QueryTranslator или что-то еще. Спасибо
dev ray
Эй ... Я пытался это, но это не похоже на сохранение или обновление. Я думаю, что это работает только для запросов на выборку, где перевод с hql на sql вступает в игру
dev ray
1
Плагин Log4Jdbc будет лучше для вашего требования. Это показывает следующее-
1.Complete SQL query being hit to the db
2.Parameter values being passed to the query
3.Execution time taken by each query
Ни один из вышеупомянутых ответов не напечатает sql с параметрами должным образом или является проблемой. Я добился этого с помощью WireShark , который захватывает все sql / команды, отправляемые из приложения в Oracle / Mysql и т. Д. С запросами.
Все ответы здесь полезны, но если вы используете XML-контекст приложения Spring для настройки своей фабрики сеансов, установка переменной уровня SQL log4j только помогает вам в этом, вы также должны установить переменную hibernate.show_sql. в самом контексте приложения, чтобы Hibernate начал показывать значения.
ApplicationContext.xml имеет:
<propertyname="hibernateProperties"><value>
hibernate.jdbc.batch_size=25
... <!-- Other parameter values here -->
hibernate.show_sql=true
</value></property>
Спасибо, он печатает запрос, но не параметры, которые он использовал, есть ли способ напечатать параметры тоже?
Лиз Лампероуг
0
Hibernate показывает запрос и значения его параметров в разных строках.
Если вы используете application.properties при весенней загрузке и можете использовать ниже выделенный параметр в application.properties.
org.hibernate.SQL будет показывать запросы
logging.level.org.hibernate.SQL = ОТЛАДКА
org.hibernate.type покажет все значения параметров, которые будут сопоставлены с запросами выбора, вставки и обновления. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType покажет значение параметра типа enum
logging.level.org.hibernate.type.EnumType = TRACE
пример ::
2018-06-1411:06:28,217 TRACE [main][EnumType.java :321]Binding[active] to parameter:[1]
sql.BasicBinder покажет целое, varchar, значение параметра логического типа
Даже это не показывает значения предела и смещения в запросах.
T3rm1
0
Самым простым решением для меня является реализация обычного stringReplace для замены входных параметров на значения параметров (для простоты трактуя все параметры как строку):
String debugedSql = sql;//then, for each named parameter
debugedSql = debugedSql.replaceAll(":"+key,"'"+value.toString()+"'");//and finnaly
println(debugedSql);
или что-то подобное для позиционных параметров (?).
Позаботьтесь о пустых значениях и конкретных типах значений, таких как дата, если вы хотите, чтобы готовый SQL-файл был записан в журнал.
Ответы:
Вам необходимо включить ведение журнала для следующих категорий:
org.hibernate.SQL
- установите дляdebug
регистрации всех операторов SQL DML по мере их выполненияorg.hibernate.type
- установите дляtrace
регистрации всех параметров JDBCТаким образом, конфигурация log4j может выглядеть так:
Первое эквивалентно
hibernate.show_sql=true
устаревшему свойству , второе печатает связанные параметры среди прочего.Другое решение (не основанное на спящем режиме) будет использовать прокси-драйвер JDBC, такой как P6Spy .
источник
org.hibernate.type.descriptor.sql.BasicBinder
регистратор. Включение входа в системуorg.hibernate.type
напечатало слишком много бесполезной информации для меня ...org.hibernate.type
иorg.hibernate.loader.hql
не работать у меня, чтобы показать параметрыПросто для удобства вот тот же пример конфигурации для Logback (SLF4J)
Вывод в вашем sql.log (пример) выглядит так:
источник
Изменить
hibernate.cfg.xml
на:Включите записи log4j и ниже в "log4j.properties":
источник
binding parameter [1] as [VARCHAR] - [1]
.В случае использования весенней загрузки, просто настройте это:
aplication.yml
aplication.properties
и ничего более.
НТН
источник
Log4JDBC - хорошее решение, которое печатает точное SQL, идущий в базу данных с параметрами, а не самый популярный ответ, который не делает этого. Одним из основных преимуществ этого является то, что вы можете копировать SQL прямо в интерфейс DB и выполнять как есть.
http://log4jdbc.sourceforge.net/
https://code.google.com/p/log4jdbc-remix/
Последний также выводит табличное представление результатов запроса.
Пример вывода, показывающий сгенерированный SQL с параметрами на месте вместе с таблицей набора результатов из запроса:
Обновление 2016
Совсем недавно я использовал log4jdbc-log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ ) с SLF4j и logback. Зависимости Maven, необходимые для моей установки, перечислены ниже:
Драйвер и URL-адрес БД выглядят следующим образом:
Мой файл конфигурации logback.xml выглядит следующим образом: здесь выводятся все операторы SQL с параметрами плюс таблицы наборов результатов для всех запросов.
Наконец, мне пришлось создать файл с именем log4jdbc.log4j2.properties в корне пути к классам, например, src / test / resources или src / main / resources в проекте Mevn. Этот файл имеет одну строку, которая ниже:
Выше будет зависеть от вашей библиотеки журналов. См. Документы по адресу https://code.google.com/archive/p/log4jdbc-log4j2. получения дополнительной информации
Пример вывода:
источник
Вы можете добавить строки категорий в log4j.xml:
и добавьте свойства гибернации:
источник
Добавьте следующие свойства и значения в конфигурацию log4j или logback:
источник
org.hibernate.type.descriptor.sql.BasicBinder
Категория не включает в себя все параметры, например перечисления типов. Так что если вы хотите всего, вам действительно нужноTRACE
для всейorg.hibernate.type
группы.Вы можете сделать это, используя datasource-proxy , как я описал в этом посте. .
Предполагая, что ваше приложение ожидает
dataSource
bean-компонент (например, через@Resource
), вы можете настроить его следующим образомdatasource-proxy
:Теперь вывод Hibernate vs datasource-proxy:
В
datasource-proxy
запросах содержат значение параметров , и вы даже можете добавить пользовательские выписки JDBC - перехватчики , так что вы можете поймать N +-вопросы запросов прямо из ваших тестов интеграции .источник
включите
org.hibernate.type
регистратор, чтобы увидеть, как фактические параметры связаны с вопросительными знаками.источник
источник
Решение верное, но также регистрируются все привязки для объектов результата. Чтобы предотвратить это, можно создать отдельное приложение и включить фильтрацию, например:
источник
источник
Этот ответ немного отклоняется от вопроса. Иногда нам нужно только sql только для целей отладки во время выполнения. В этом случае есть более простой способ, используя отладку в редакторах.
Это для hibernate 3. Я не уверен, что это работает на других версиях.
источник
Драйвер mysql jdbc уже предоставил удобный для удовлетворения этого требования, вы должны по крайней мере иметь версию jar> = mysql-connect-jar-5.1.6.jar
Шаг 1: [сконфигурируйте свой jdbc.url, чтобы добавить регистратор и пользовательский журнал]
Теперь он использует ведение журнала slf4j. Если по умолчанию ведется запись в журнал log4j, вы должны добавить зависимости slf4j-api, slf4j-log4j12, чтобы использовать ведение журнала slf4j.
шаг 2: [напишите свою собственную регистрацию]
источник
Мне нравится это для log4j:
источник
Ведение журнала работает, но не совсем то, что вы хотите или я хотел некоторое время назад, но P6Spy работает отлично ,
Вот простой учебник для реализации MKYONG учебник для P6Spy .
для меня это сработало как шарм.
Получите «p6spy-install.jar»
Извлеките
p6spy-install.jar
файл, найдитеp6spy.jar
иspy.properties
Добавьте
p6spy.jar
в свой проект библиотеку зависимостейИзмените файл конфигурации базы данных. Вам необходимо заменить существующий драйвер JDBC на драйвер JDBC P6Spy -
com.p6spy.engine.spy.P6SpyDriver
Оригинальный драйвер MySQL JDBC -
com.mysql.jdbc.Driver
Поменял его на драйвер P6Spy JDBC -
com.p6spy.engine.spy.P6SpyDriver
spy.properties
Замените
real driver
существующим драйвером MySQL JDBCИзмените расположение файла журнала. Измените расположение файла журнала в свойстве файла журнала, все операторы SQL будут входить в этот файл.
Windows
* Никс
“spy.properties”
в classpath проектаСкопируйте
“spy.properties”
в корневую папку вашего проекта, убедитесь, что ваш проект может найти «spy.properties», иначе он предложит“spy.properties”
файлу не найденное исключение.источник
источник
Используя Hibernate 4 и slf4j / log4j2, я попытался добавить следующее в мою конфигурацию log4j2.xml:
Но без успеха.
Через эту ветку я узнал, что фреймворк jboss-logging, используемый hibernate, необходимо настроить для входа в систему через slf4j. Я добавил следующий аргумент к аргументам виртуальной машины приложения:
И это сработало как шарм.
источник
Вот что сработало для меня, установите свойство ниже в файле log4j.file:
Настройки свойств Hibernate:
источник
для разработки с Wildfly (standalone.xml), добавьте эти логгеры:
источник
если вы используете Hibernate 3.2.xx использовать
вместо
источник
Вы можете войти это:
Пример вывода:
источник
Плагин Log4Jdbc будет лучше для вашего требования. Это показывает следующее-
Ссылка ниже, чтобы настроить Log4Jdbc-
источник
Используйте Wireshark или что-то подобное:
Ни один из вышеупомянутых ответов не напечатает sql с параметрами должным образом или является проблемой. Я добился этого с помощью WireShark , который захватывает все sql / команды, отправляемые из приложения в Oracle / Mysql и т. Д. С запросами.
источник
Все ответы здесь полезны, но если вы используете XML-контекст приложения Spring для настройки своей фабрики сеансов, установка переменной уровня SQL log4j только помогает вам в этом, вы также должны установить переменную hibernate.show_sql. в самом контексте приложения, чтобы Hibernate начал показывать значения.
ApplicationContext.xml имеет:
И ваш файл log4j нуждается
источник
В Java:
Преобразуйте ваш запрос в TypedQuery, если это CriteriaQuery (javax.persistence).
Затем:
query.unwrap (org.hibernate.Query.class) .getQueryString ();
источник
Hibernate показывает запрос и значения его параметров в разных строках.
Если вы используете application.properties при весенней загрузке и можете использовать ниже выделенный параметр в application.properties.
org.hibernate.SQL будет показывать запросы
logging.level.org.hibernate.SQL = ОТЛАДКА
org.hibernate.type покажет все значения параметров, которые будут сопоставлены с запросами выбора, вставки и обновления. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType покажет значение параметра типа enum
logging.level.org.hibernate.type.EnumType = TRACE
пример ::
sql.BasicBinder покажет целое, varchar, значение параметра логического типа
logging.level.org.hibernate.type.descriptor.sql.BasicBinder = TRACE
пример ::
источник
Самым простым решением для меня является реализация обычного stringReplace для замены входных параметров на значения параметров (для простоты трактуя все параметры как строку):
или что-то подобное для позиционных параметров (?).
Позаботьтесь о пустых значениях и конкретных типах значений, таких как дата, если вы хотите, чтобы готовый SQL-файл был записан в журнал.
источник