Spring Boot'ta SQL deyimleri nasıl kaydedilir?


342

SQL deyimlerini bir dosyaya kaydetmek istiyorum.
Ben aşağıdaki özelliklere sahipapplication.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

Uygulamamı çalıştırdığımda

cmd>mvn spring-boot:run

Konsolda sql deyimlerini görebiliyorum ama app.log dosyasında görünmüyorlar. Dosya yalnızca ilkbahardaki temel günlükleri içerir.

Günlük dosyasında sql deyimlerini görmek için ne yapmalıyım?

Yanıtlar:


458

bunu özellikler dosyanızda kullanmayı deneyin:

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

74
Değerleri de logging.level.org.hibernate.type=TRACE
kaydetmek

2
Ancak bu yalnızca birkaç bağ değeri kaydeder. Ölçütler-API'sındaki değerleri nasıl kaydedebilirim? Spesifikasyonlar kullanırsam, CriteriaBuilder ile oluşturulan ilişkili parametreler için çıktı almıyorum.
Josh

204

Bu stdout için de çalışır:

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

Değerleri günlüğe kaydetmek için:

logging.level.org.hibernate.type=trace

Sadece şunu ekleyin application.properties.


11
Değerleri de spring.jpa.properties.hibernate.type=trace
kaydetmek

1
Bu günlük dosyasına yazmaz, bu
STDOUT'a

4
Hala sadece ?parametreler yerine görüyorum . Bu çözüm bana gösterecek miydi?
Adeynack

1
spring.jpa.properties.hibernate.type = izleme günlük dosyamı etkilemez; (
gstackoverflow

1
"Type = trace" bir spring özelliği değildir, bu nedenle çalışmaz. Aşağıda verilen çözüm stackoverflow.com/a/41594913/5107365 bunun için doğru çözümdür .
Raj

97

Bu benim için çalışıyor (YAML):

spring:
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true
logging:
  level:
    org:
      hibernate:
        type: trace

18

Lütfen kullan:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
spring.jpa.show-sql=true

4
logging.level.org.hibernate.SQL=DEBUGbenim için işe yaradı ve diğer cevaplar için eksikti. Teşekkürler!
Vic

18

Eğer bir logback-spring.xml veya buna benzer bir şey kullanıyorsanız, buna aşağıdaki kodu ekleyin

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

benim için çalışıyor.

Bağlama değişkenlerini de almak için:

<logger name="org.hibernate.type.descriptor.sql" level="trace">
    <appender-ref ref="file" />
</logger>

1
Spring Boot ile kullanmak zorundasınız<appender-ref ref="FILE" />
Ortomala Lokni

appender ref, xml geri dönüşünde tanımladığınız ekleyicinin adıdır. Sadece bir değişken
Raja Anbazhagan

17

Bu çok yaygın bir soru olduğundan, bu cevabın dayandığı bu makaleyi yazdım .

Kaçınılması gereken ayarlar

Bu ayarı kullanmamalısınız:

spring.jpa.show-sql=true 

Sorun show-sql, SQL deyimlerinin konsolda yazdırılmasıdır, bu nedenle normalde bir Günlük çerçevesi ile yaptığınız gibi filtrelemenin bir yolu yoktur.

Hazırda Bekletme günlüğünü kullanma

Günlük yapılandırma dosyanıza, aşağıdaki günlükçüyü eklerseniz:

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

Ardından, Hazırda Bekletme JDBC PreparedStatementoluşturulduğunda SQL deyimlerini yazdırır . Bu nedenle ifade, parametre yer tutucuları kullanılarak günlüğe kaydedilir:

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

Bind parametresi değerlerini günlüğe kaydetmek istiyorsanız, aşağıdaki günlükçüyü de eklemeniz yeterlidir:

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

BasicBinderKaydediciyi ayarladıktan sonra , bind parametre değerlerinin de günlüğe kaydedildiğini göreceksiniz:

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]

Veri kaynağı proxy'sini kullanma

Veri kaynağı proxy vekil gerçek JDBC için olanak sağlar DataSource, aşağıdaki şemada gösterildiği gibi,:

Veri Kaynağı-Vekil

Sen tanımlayabilirsiniz dataSourceşöyle hazırda tarafından kullanılacak fasulye:

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

Uygulamanızda kullandığınız bağlantı havuzu tarafından tanımlanmış actualDataSourceolması gerektiğine dikkat edin .DataSource

Etkinleştirdikten sonra datasource-proxy, SQl ifadesi aşağıdaki gibi günlüğe kaydedilir:

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 sunucu sürücüsü için (Microsoft SQL Server JDBC Sürücüsü).

kullanmayı deneyin:

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

application.properties dosyanızda.

Kişisel tercihim:

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

Referans için bu bağlantılara bakabilirsiniz:


8

Belgelere göre :

spring.jpa.show-sql=true # Enable logging of SQL statements.

Ters bir sorunum var, bunu yanlış olarak ayarlıyorum ve org.hibernate düzey HATA ve hala yazdırma düşüşü / oluştur / ekle / seç
Kalpesh Soni

5

YAML'ye tercüme edilen kabul edilmiş cevap benim için çalışıyor

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

3
Tek kullanımlık aksesuarlar için yuva yapmak istemiyorsanız logging.level.org.hibernate.SQL: TRACE logging.level.org.hibernate.type.descriptor.sql.BasicBinder: TRACE
YAML'deki

4

Bunlardan herhangi birini application.properties dosyasında kullanabiliriz:

spring.jpa.show-sql=true 

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

veya

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

Sorgulamak için kullanılan gerçek parametreleri görüntülemek istiyorsanız,

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

Ardından, gerçek parametre değerinin şu şekilde görüntülendiğine dikkat edin: 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

Standart çıkışta oturum açın

a ekle application.properties

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

Bu hazırlanmış sorguların parametrelerini günlüğe kaydetmese de SQL sorgularını yazdırmanın en basit yoludur. Ve optimize edilmiş günlükleme çerçevesi gibi olmadığı için önerilmez.

Günlük Çerçevesini Kullanma

a ekle 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

Yukarıdaki özellikleri belirterek, günlük girdileri, geri oturum açma veya log4j gibi yapılandırılmış günlük ekleyicisine gönderilir.


0

Bu ayarla ilgili sorun yaşıyorsanız ve bazen çalışmıyor gibi görünüyor, diğer zamanlarda değil - çalışmadığı zamanların birim testler sırasında olup olmadığını göz önünde bulundurun.

Birçok kişi @TestPropertySources, test devralma hiyerarşinizde bir yerde bildirilen ek açıklama yoluyla özel test zamanı özellikleri beyan eder. Bu, application.propertiesayarladığınız değerlerin test zamanında etkili bir şekilde yok sayılması için , sizin veya diğer üretim özellikleri ayarlarınıza ne koyarsanız onu geçersiz kılar .


0

spring.jpa.properties.hibernate.show_sql=trueApplication.properties koymak her zaman yardımcı olmadı.

properties.put("hibernate.show_sql", "true");Veritabanı yapılandırmasının özelliklerine eklemeyi deneyebilirsiniz .

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.