จะบันทึกคำสั่ง 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
elysch

2
แต่นี่จะบันทึกค่าการเชื่อมโยงเพียงไม่กี่ค่า ฉันจะบันทึกค่าจาก criteria-API ได้อย่างไร ถ้าฉันใช้ข้อมูลจำเพาะฉันจะไม่ได้รับผลลัพธ์ใด ๆ สำหรับพารามิเตอร์ที่ผูกไว้ซึ่งสร้างด้วย CriteriaBuilder
Josh

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
ฉันยังเห็นเฉพาะ?พารามิเตอร์แทนเท่านั้น คำตอบนั้นควรที่จะแสดงให้ฉันเห็นไหม?
Adeynack

1
spring.jpa.properties.hibernate.type = การติดตามไม่ส่งผลต่อไฟล์บันทึกของฉัน (
gstackoverflow

1
"type = trace" ไม่ใช่คุณสมบัติสปริงดังนั้นจึงไม่ทำงาน stackoverflow.com/a/41594913/5107365ด้านล่างเป็นทางออกที่เหมาะสม
ราชา


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
ด้วย Spring Boot คุณต้องใช้<appender-ref ref="FILE" />
Ortomala Lokni

appender ref เป็นชื่อของ appender ที่คุณกำหนดไว้ใน logback xml มันเป็นเพียงตัวแปร
ราชา Anbazhagan

17

เนื่องจากนี่เป็นคำถามที่พบบ่อยมากฉันจึงเขียน บทความนี้ขึ้นอยู่กับคำตอบนี้

การตั้งค่าที่ควรหลีกเลี่ยง

คุณไม่ควรใช้การตั้งค่านี้:

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 (?, ?, ?)

หากคุณต้องการบันทึกค่าพารามิเตอร์ bind เพียงเพิ่มตัวบันทึกต่อไปนี้ด้วย:

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

เมื่อคุณตั้งค่าตัวBasicBinderบันทึกคุณจะเห็นว่าค่าพารามิเตอร์ bind ถูกบันทึกเช่นกัน:

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]

การใช้แหล่งข้อมูลพร็อกซี่

แหล่งข้อมูล-พร็อกซี่ช่วยให้คุณพร็อกซี่ที่เกิดขึ้นจริง JDBC DataSource, แสดงตามแผนภาพต่อไปนี้:

แหล่งข้อมูลพร็อกซี

คุณสามารถกำหนด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 (ไดรเวอร์ Microsoft SQL Server JDBC)

ลองใช้:

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

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 แม้ว่าจะไม่ได้บันทึกพารามิเตอร์ของคำสั่งที่เตรียมไว้ และไม่แนะนำเนื่องจากไม่ได้เป็นเฟรมเวิร์กการบันทึกที่ปรับให้เหมาะสม

การใช้ 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

โดยการระบุคุณสมบัติข้างต้นรายการบันทึกจะถูกส่งไปยังตัวบันทึกการกำหนดค่าเช่นบันทึกกลับหรือ 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();
    }

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.