Як увійти в оператор 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
elysch

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.


11
Якщо ви також хочете записати значення:spring.jpa.properties.hibernate.type=trace
elysch

1
Це не пише у файл журналу, це пише в STDOUT
Muhammad Hewedy

4
Я все ще бачу лише ?замість параметрів. Це рішення повинно було мені показати?
Адейнак

1
spring.jpa.properties.hibernate.type = слід не впливає на мій файл журналу; (
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

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
Із весняним завантаженням ви повинні користуватися<appender-ref ref="FILE" />
Ortomala Lokni

refnder appender - це ім'я додатка, яке ви визначили в xml для входу в систему. Це лише змінна
Раджа Анбаджаган

17

Оскільки це дуже поширене питання, я написав цю статтю , на якій ґрунтується ця відповідь.

Налаштування, яких слід уникати

Ви не повинні використовувати цей параметр:

spring.jpa.show-sql=true 

Проблема show-sqlполягає в тому, що оператори SQL друкуються в консолі, тому немає можливості їх фільтрувати, як це зазвичай робиться з системою Logging.

Використання режиму сплячого режиму

У файлі конфігурації журналу, якщо ви додали такий реєстратор:

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

Потім Hibernate надрукує оператори SQL, коли PreparedStatementбуде створено JDBC . Ось чому оператор буде реєструватися за допомогою заповнювачів параметрів:

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-проксі дозволяє проксі фактичної JDBC DataSource, як показано на наступній схемі:

DataSource-Proxy

Ви можете визначити 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визначено пулом з'єднань, який ви використовуєте у своїй програмі.

Після ввімкнення 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.

У мене є зворотна проблема, встановивши це значення false, і org.hibernate вирівняти ПОМИЛКУ та її все ще падіння друку / створення / вставлення / вибору
Kalpesh Soni

5

Перекладена прийнята відповідь YAML працює на мене

logging:
  level:
    org:
      hibernate:
        SQL:
          TRACE
        type:
          descriptor:
            sql:
              BasicBinder:
                TRACE

3
Ви також можете використовувати плоскі властивості в YAML, якщо ви не хочете гніздо для одноразових реквізитів, як-от: logging.level.org.hibernate.SQL: TRACE logging.level.org.hibernate.type.descriptor.sql.BasicBinder: TRACE
MarcinJ

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, хоча він не реєструє параметри підготовлених операторів. І це не рекомендується, оскільки його не такі оптимізовані рамки ведення журналу.

Використання системи реєстрації журналів

Додати до 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.


0

Якщо у вас виникають проблеми з цим налаштуванням, і, здається, він працює іноді, а не інший час - врахуйте, чи час, коли він не працює, під час одиничних тестів.

Багато людей оголошують власні властивості тестового часу за допомогою @TestPropertySourcesанотації, декларованої десь у вашій ієрархії тестової спадщини. Це скасує те, що ви application.propertiesвводите у свої чи інші параметри виробничих властивостей, щоб ті значення, які ви встановлюєте, фактично ігнорувалися під час тестування.


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();
    }

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.