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

342

Я хочу записывать операторы 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 в файле журнала?

Олег Павлив
источник

Ответы:

458

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

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
Пол Вудс
источник
74
Если вы тоже logging.level.org.hibernate.type=TRACE
хотите записать
2
Но это регистрирует только несколько значений привязки. Как я могу записать значения из API-критериев? Если я использую спецификации, я не получаю вывод для связанных параметров, созданных с помощью CriteriaBuilder.
Джош
204

Это работает и для stdout:

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.

v.ladynev
источник
11
Если вы тоже spring.jpa.properties.hibernate.type=trace
хотите записать
1
Это не запись в лог-файл, это запись в STDOUT
Мухаммед Хьюди
4
Я все еще вижу только ?вместо параметров. Это решение должно было показать их мне?
Адейнак
1
spring.jpa.properties.hibernate.type = trace не влияет на мой файл журнала; (
gstackoverflow
1
Тип = трассировка не является свойством пружины, поэтому оно не работает. Решение, приведенное ниже stackoverflow.com/a/41594913/5107365, является правильным для этого.
Радж
97

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

spring:
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true
logging:
  level:
    org:
      hibernate:
        type: trace
Мишель
источник
18

Пожалуйста, используйте:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
spring.jpa.show-sql=true
rahulnikhare
источник
4
logging.level.org.hibernate.SQL=DEBUGзаставил это работать для меня и отсутствовал для других ответов. Спасибо!
Вик
18

если у вас есть 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>
Эдье Чан
источник
1
С Spring Boot вы должны использовать<appender-ref ref="FILE" />
Ortomala Lokni
appender ref - это имя appender, которое вы определили в logback xml. Это только переменная
Раджа Анбажаган
17

Поскольку это очень распространенный вопрос, я написал эту статью , на которой основан этот ответ.

Настройки, чтобы избежать

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

spring.jpa.show-sql=true 

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

Использование журнала Hibernate

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

<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

DataSource-прокси позволяет прокси фактической JDBC DataSource, как показано на следующей схеме:

DataSource-Proxy

Вы можете определить dataSourcebean-компонент, который будет использоваться 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определяться пулом соединений, который вы используете в своем приложении.

Как только вы включите 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)]
Влад Михалча
источник
11

Для драйвера сервера 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

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

Хавьер З.
источник
8

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

spring.jpa.show-sql=true # Enable logging of SQL statements.
Макс Фарсиков
источник
У меня есть обратная проблема, устанавливая это ложь, и org.hibernate до уровня ошибок и его по- прежнему печати капли / создать / вставка / выбрать
Kalpesh Soni
5

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

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

Мы можем использовать любой из них в файле 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_
Лова Читтумури
источник
3

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

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]
Удара С.С. Лиянаге
источник
3

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

добавить в 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.

Saveendra Ekanayake
источник
0

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

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

Shorn
источник
0

Ввод 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();
    }
SJX
источник