Как регистрировать операторы SQL в Spring Boot?

avatar
Oleg Pavliv
8 мая 2015 в 07:55
440311
21
438

Я хочу записывать операторы SQL в файл.
У меня есть следующие свойства в application.properties

spring.datasource.url=...
spring.datasource.username=user
spring.datasource.password=1234
spring.datasource.driver-class-name=net.sourceforge.jtds.jdbc.Driver

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

security.ignored=true
security.basic.enabled=false

logging.level.org.springframework.web=INFO
logging.level.org.hibernate=INFO
logging.file=c:/temp/my-log/app.log

Когда я запускаю свое приложение

cmd>mvn spring-boot:run

Я вижу операторы sql в консоли, но они не отображаются в файле app.log. Файл содержит только базовые логи с весны.

Что мне делать, чтобы увидеть sql-операторы в файле журнала?

Источник
Lu55
4 февраля 2021 в 19:31
1

Следуйте инструкциям на baeldung.com/sql-logging-spring-boot

Ответы (21)

avatar
Paul Woods
6 июля 2015 в 15:39
579

попробуйте использовать это в своем файле свойств:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
elysch
11 июня 2016 в 00:48
104

Если вы хотите также регистрировать значения: logging.level.org.hibernate.type=TRACE

Josh
10 августа 2016 в 05:48
3

Но это регистрирует только несколько значений привязки. Как я могу регистрировать значения из API-интерфейса критериев? Если я использую спецификации, я не получаю вывода для связанных параметров, созданных с помощью CriteriaBuilder.

payne
26 октября 2021 в 21:12
0

А как насчет людей, которые используют EclipseLink вместо Hibernate?

avatar
Shafiul
28 января 2022 в 18:15
0

Если вы используете JdbcTemplate, добавьте приведенный ниже файл application.properties для регистрации значений sql и параметров.

logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG
logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE
avatar
Mohit Kaushal
9 декабря 2021 в 05:29
1

Вы можете просто добавить следующие строки в application.properties для стандартных SQL-запросов:

spring.jpa.properties.hibernate.show_sql=true
avatar
AnkitSingh2099
18 ноября 2021 в 18:13
0

Добавьте их в свойствах. Цитата Hibernate Show SQL:

#show sql statement
logging.level.org.hibernate.SQL=debug

#show sql values
logging.level.org.hibernate.type.descriptor.sql=trace
avatar
Souradeep Banerjee
8 октября 2021 в 07:26
0

Основной способ - добавить следующие строки в ваш application.properties. Это позволит весенней загрузке регистрировать все выполняемые SQL-запросы:

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

Вторая строка используется для украшения SQL-операторов.

Если вы хотите использовать логгеры, вы можете использовать следующие строки:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

Вторая строка используется для печати всех параметров, связанных с вашими запросами. Надеюсь, что это работает для вас. Пожалуйста, дайте мне знать, если у вас возникнут дополнительные вопросы!

avatar
shenyu1997
31 августа 2021 в 05:40
0

В моем yaml:

logging:
  level:
    org.hibernate.SQL: DEBUG
    org.hibernate.type.descriptor.sql: TRACE

Версия Spring загрузки: 2.3.5.RELEASE

avatar
BRAIEK AYEMN
3 августа 2020 в 12:57
4

используйте этот код в файле application.properties:

#Enable logging for config troubeshooting
logging.level.org.hibernate.SQL=DEBUG
logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
avatar
Java Developer
15 июня 2020 в 12:17
2

Вам просто нужно установить spring.jpa.show-sql=true в application.properties например, вы можете сослаться на этот https://github.com/007anwar/ConfigServerRepo/blob/master/application.yaml

avatar
Vlad Mihalcea
18 февраля 2020 в 20:33
106

Настройки, которых следует избегать

Не используйте этот параметр:

spring.jpa.show-sql=true 

Проблема с show-sql заключается в том, что операторы SQL печатаются в консоли, поэтому нет возможности их отфильтровать, как это обычно делается в среде ведения журнала.

Использование журнала гибернации

В файле конфигурации журнала, если вы добавите следующее средство ведения журнала:

<logger name="org.hibernate.SQL" level="debug"/>

Затем Hibernate будет печатать операторы SQL при создании JDBC PreparedStatement. Вот почему оператор будет регистрироваться с использованием заполнителей параметров:

INSERT INTO post (title, version, id) VALUES (?  ?  ?)

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

<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>

После того, как вы установите регистратор BasicBinder, вы увидите, что значения параметров привязки также записываются:

DEBUG [main]: o.h.SQL - insert into post (title, version, id) values (?  ?  ?)
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [1] as [VARCHAR] - [High-Performance Java Persistence, part 1]
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [2] as [INTEGER] - [0]
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [3] as [BIGINT] - [1]

Использование прокси источника данных

datasource-proxy OSS framework позволяет вам проксировать фактический JDBC DataSource, как показано на следующей диаграмме:

DataSource-Proxy

Вы можете определить bean-компонент dataSource, который будет использоваться Hibernate, следующим образом:

@Bean
public DataSource dataSource(DataSource actualDataSource) {
    SLF4JQueryLoggingListener loggingListener = new SLF4JQueryLoggingListener();
    loggingListener.setQueryLogEntryCreator(new InlineQueryLogEntryCreator());
    return ProxyDataSourceBuilder
        .create(actualDataSource)
        .name(DATA_SOURCE_PROXY_NAME)
        .listener(loggingListener)
        .build();
}

Обратите внимание, что actualDataSource должен быть DataSource определенным [пулом соединений] [2], который вы используете в своем приложении.

Затем вам необходимо установить уровень журнала net.ttddyy.dsproxy.listener на debug в файле конфигурации вашей платформы ведения журнала. Например, если вы используете Logback, вы можете добавить следующий регистратор:

<logger name="net.ttddyy.dsproxy.listener" level="debug"/>

После включения datasource-proxy оператор SQl будет зарегистрирован следующим образом:

Name:DATA_SOURCE_PROXY, Time:6, Success:True,
Type:Prepared, Batch:True, QuerySize:1, BatchSize:3,
Query:["insert into post (title, version, id) values (?  ?  ?)"],
Params:[(Post no. 0, 0, 0), (Post no. 1, 0, 1), (Post no. 2, 0, 2)]
Christos Karapapas
2 октября 2020 в 18:23
1

Что именно означает здесь для включения datasource-proxy? Это другая конфигурация? Есть ли что-то еще, что требует настройки помимо создания bean-компонента с правильным источником данных? Нужно ли нам сейчас что-то настраивать в файле log4j.properties?

Vlad Mihalcea
20 декабря 2020 в 16:03
1

Я обновил ответ, чтобы ответить на ваши вопросы.

funder7
5 марта 2021 в 10:43
1

Отличный ответ! Спасибо

Алексеев станислав
22 июля 2021 в 09:01
0

Это не работает, откуда Hibernate знает, что использовать этот bean-компонент?

Dave Pradana
23 июля 2021 в 17:14
0

Хорошо объяснено.

avatar
Saveendra Ekanayake
23 октября 2019 в 06:28
9

Войдите в стандартный вывод

Добавить в application.properties

### to enable
spring.jpa.show-sql=true
### to make the printing SQL beautify
spring.jpa.properties.hibernate.format_sql=true

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

Использование Logging Framework

Добавить в application.properties

### logs the SQL queries
logging.level.org.hibernate.SQL=DEBUG
### logs the prepared statement parameters
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
### to make the printing SQL beautify
spring.jpa.properties.hibernate.format_sql=true

При указании вышеуказанных свойств записи журналов будут отправляться настроенному приложению журнала, например, log-back или log4j.

avatar
SJX
16 сентября 2019 в 14:00
2

Добавление spring.jpa.properties.hibernate.show_sql=true в application.properties не всегда помогало.

Вы можете попробовать добавить properties.put("hibernate.show_sql", "true"); в свойства конфигурации базы данных.

public class DbConfig {

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean
    entityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("dataSource") DataSource dataSource
    ) {
        Map<String, Object> properties = new HashMap();
        properties.put("hibernate.hbm2ddl.auto", "validate");
        properties.put("hibernate.show_sql", "true");

        return builder
                .dataSource(dataSource)
                .packages("com.test.dbsource.domain")
                .persistenceUnit("dbsource").properties(properties)
                .build();
    }
avatar
Shorn
9 сентября 2019 в 02:39
2

Если у вас возникли проблемы с этим параметром, и он иногда работает, а не в других случаях - подумайте, не приходилось ли время, когда это не работает, во время модульных тестов.

Многие люди объявляют настраиваемые свойства времени тестирования с помощью аннотации @TestPropertySources, объявленной где-то в иерархии наследования тестов. Это переопределит все, что вы указали в настройках application.properties или других производственных свойств, поэтому эти значения, которые вы устанавливаете, фактически игнорируются во время тестирования.

avatar
Robert.Li
12 марта 2019 в 21:39
11

Перевод принятого ответа на YAML у меня работает

logging:
  level:
    org:
      hibernate:
        SQL:
          TRACE
        type:
          descriptor:
            sql:
              BasicBinder:
                TRACE
MarcinJ
23 января 2020 в 15:53
5

Вы также можете использовать плоские свойства в YAML, если не хотите вкладывать одноразовые реквизиты, например: logging.level.org.hibernate.SQL: TRACE logging.level.org.hibernate.type.descriptor.sql.BasicBinder: TRACE

avatar
Lova Chittumuri
23 ноября 2018 в 06:58
6

Мы можем использовать любой из этих в файле application.properties :

spring.jpa.show-sql=true 

example :
//Hibernate: select country0_.id as id1_0_, country0_.name as name2_0_ from country country0_

или

logging.level.org.hibernate.SQL=debug 

example :
2018-11-23 12:28:02.990 DEBUG 12972 --- [nio-8086-exec-2] org.hibernate.SQL   : select country0_.id as id1_0_, country0_.name as name2_0_ from country country0_
avatar
Udara S.S Liyanage
7 августа 2018 в 06:17
6

Если вы хотите просмотреть фактические параметры, используемые для запроса, вы можете использовать

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql=TRACE

Затем обратите внимание, что фактическое значение параметра отображается как binding parameter......

   2018-08-07 14:14:36.079 DEBUG 44804 --- [           main] org.hibernate.SQL                        : select employee0_.id as id1_0_, employee0_.department as departme2_0_, employee0_.joining_date as joining_3_0_, employee0_.name as name4_0_ from employee employee0_ where employee0_.joining_date=?
    2018-08-07 14:14:36.079 TRACE 44804 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [TIMESTAMP] - [Tue Aug 07 00:00:00 SGT 2018]
avatar
rahulnikhare
21 декабря 2017 в 08:50
26

Используйте:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
spring.jpa.show-sql=true
Vic
27 марта 2019 в 16:58
5

logging.level.org.hibernate.SQL=DEBUG заставил его работать для меня и отсутствовал для других ответов. Спасибо!

avatar
Max Farsikov
21 ноября 2017 в 20:54
10

Согласно документации это:

spring.jpa.show-sql=true # Enable logging of SQL statements.
Kalpesh Soni
1 ноября 2018 в 22:14
0

У меня обратная проблема, установив для нее значение false и org.hibernate на уровень ERROR, и его все еще печатается drop / create / insert / select

avatar
Edye Chan
17 июля 2017 в 06:41
21

Если у вас есть файл logback-spring.xml или что-то в этом роде, добавьте к нему следующий код

<logger name="org.hibernate.SQL" level="trace" additivity="false">
    <appender-ref ref="file" />
</logger>

Это работает для меня.

Чтобы также получить переменные связывания:

<logger name="org.hibernate.type.descriptor.sql" level="trace">
    <appender-ref ref="file" />
</logger>
Ortomala Lokni
3 мая 2018 в 15:28
1

С Spring Boot вы должны использовать <appender-ref ref="FILE" />

Raja Anbazhagan
19 июля 2018 в 12:25
0

appender ref - это имя приложения, которое вы определили в XML-файле logback. Это всего лишь переменная

avatar
Michel
11 января 2017 в 15:37
125

Это работает для меня (YAML):

spring:
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true
logging:
  level:
    org:
      hibernate:
        type: trace
avatar
v.ladynev
26 мая 2016 в 15:20
261

Это работает и для стандартного вывода:

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true

Для записи значений:

logging.level.org.hibernate.type=trace

Просто добавьте это к application.properties.

elysch
11 июня 2016 в 00:48
14

Если вы хотите также регистрировать значения: spring.jpa.properties.hibernate.type=trace

Muhammad Hewedy
29 июня 2016 в 08:34
1

Это не записывается в файл журнала, это записывается в STDOUT

Adeynack
2 февраля 2018 в 08:54
4

Я все еще вижу только ? вместо параметров. Это решение должно было показать их мне?

v.ladynev
2 февраля 2018 в 09:59
0

@Adeynack Извини, я не могу тебе помочь. Я просто добавил его в соответствии со словами elysch .

Adeynack
5 февраля 2018 в 21:41
0

@ v.ladynev: Но он показывает вам значение параметров или показывает знаки вопроса?

gstackoverflow
4 сентября 2018 в 16:54
1

spring.jpa.properties.hibernate.type = trace не влияет на мой файл журнала; (

Raj
6 февраля 2020 в 01:00
1

«Type = trace» не является свойством пружины, поэтому не работает. Решение, представленное ниже coderhelper.com/a/41594913/5107365, является правильным для этого.

v.ladynev
6 февраля 2020 в 16:00
0

@Raj Большое спасибо. Я обновил ответ.

payne
26 октября 2021 в 21:12
0

А как насчет людей, которые используют EclipseLink вместо Hibernate?

avatar
Javier Z.
21 марта 2016 в 19:29
14

Для драйвера сервера MS-SQL (драйвер JDBC Microsoft SQL Server).

попробуйте использовать:

logging.level.com.microsoft.sqlserver.jdbc=debug

в вашем файле application.properties.

Я лично предпочитаю установить:

logging.level.com.microsoft.sqlserver.jdbc=info
logging.level.com.microsoft.sqlserver.jdbc.internals=debug

Вы можете посмотреть эти ссылки для справки: