Làm cách nào để ghi nhật ký SQL trong Spring Boot?


342

Tôi muốn đăng nhập các câu lệnh SQL trong một tệp.
Tôi có các thuộc tính sauapplication.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

Khi tôi chạy ứng dụng của mình

cmd>mvn spring-boot:run

Tôi có thể thấy các câu lệnh sql trong bảng điều khiển nhưng chúng không xuất hiện trong tệp app.log. Các tập tin chỉ chứa các bản ghi cơ bản từ mùa xuân.

Tôi nên làm gì để xem các câu lệnh sql trong tệp nhật ký?

Câu trả lời:


458

hãy thử sử dụng điều này trong tệp thuộc tính của bạn:

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

74
Nếu bạn cũng muốn đăng nhập các giá trị:logging.level.org.hibernate.type=TRACE
elysch

2
Nhưng bản ghi này chỉ có một vài giá trị ràng buộc. Làm cách nào tôi có thể ghi lại các giá trị từ tiêu chí - API? Nếu tôi sử dụng Thông số kỹ thuật, tôi không nhận được đầu ra nào cho các tham số ràng buộc được tạo bằng CriteriaBuilder.
Josh

203

Điều này cũng hoạt động cho thiết bị xuất chuẩn:

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

Để ghi lại giá trị:

logging.level.org.hibernate.type=trace

Chỉ cần thêm điều này vào application.properties.


11
Nếu bạn cũng muốn đăng nhập các giá trị:spring.jpa.properties.hibernate.type=trace
elysch

1
Điều này không ghi vào tệp nhật ký, điều này ghi vào STDOUT
Muhammad Hewedy

4
Tôi vẫn chỉ thấy ?thay vì các tham số. Đó có phải là giải pháp cho họ thấy?
Adeynack

1
spring.jpa.properIES.hibernate.type = dấu vết không ảnh hưởng đến tệp nhật ký của tôi; (
gstackoverflow

1
"Loại = dấu vết" không phải là thuộc tính mùa xuân, vì vậy nó không hoạt động. Giải pháp được đưa ra dưới đây stackoverflow.com/a/41594913/5107365 là giải pháp phù hợp cho điều đó.
Raj

96

Điều này làm việc cho tôi (YAML):

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

18

Vui lòng sử dụng:

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

4
logging.level.org.hibernate.SQL=DEBUGlàm cho nó hoạt động cho tôi và bị thiếu cho các câu trả lời khác. Cảm ơn!
Vic

18

nếu bạn có một logback-spring.xml hoặc một cái gì đó tương tự, hãy thêm đoạn mã sau vào nó

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

làm việc cho tôi

Để có được các biến ràng buộc là tốt:

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

1
Với Spring Boot, bạn phải sử dụng<appender-ref ref="FILE" />
Ortomala Lokni

appender ref là tên của appender mà bạn đã xác định trong xml logback. Nó chỉ là một biến
Raja Anbazhagan

17

Vì đây là một câu hỏi rất phổ biến, tôi đã viết bài viết này , trên đó câu trả lời này dựa trên.

Cài đặt để tránh

Bạn không nên sử dụng cài đặt này:

spring.jpa.show-sql=true 

Vấn đề với show-sqllà các câu lệnh SQL được in trong bàn điều khiển, vì vậy không có cách nào để lọc chúng, như bạn thường làm với khung Ghi nhật ký.

Sử dụng đăng nhập Hibernate

Trong tệp cấu hình nhật ký của bạn, nếu bạn thêm trình ghi nhật ký sau:

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

Sau đó, Hibernate sẽ in các câu lệnh SQL khi JDBC PreparedStatementđược tạo. Đó là lý do tại sao câu lệnh sẽ được ghi lại bằng cách sử dụng trình giữ chỗ tham số:

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

Nếu bạn muốn đăng nhập các giá trị tham số liên kết, chỉ cần thêm trình ghi nhật ký sau:

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

Khi bạn đặt bộ BasicBinderghi, bạn sẽ thấy các giá trị tham số liên kết cũng được ghi lại:

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]

Sử dụng dataource-proxy

Các nguồn dữ liệu-proxy cho phép bạn proxy JDBC thực tế DataSource, được minh họa bằng sơ đồ sau đây:

DataSource-Proxy

Bạn có thể định nghĩa dataSourcebean sẽ được Hibernate sử dụng như sau:

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

Lưu ý rằng actualDataSourcephải được DataSourcexác định bởi nhóm kết nối bạn đang sử dụng trong ứng dụng của mình.

Khi bạn kích hoạt datasource-proxy, câu lệnh SQl sẽ được ghi lại như sau:

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

Đối với trình điều khiển máy chủ MS-SQL (Trình điều khiển JDBC của Microsoft SQL Server).

thử sử dụng:

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

trong tập tin application.properies của bạn.

Sở thích cá nhân của tôi là đặt:

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

Bạn có thể nhìn vào các liên kết này để tham khảo:


8

Theo tài liệu đó là:

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

Tôi gặp vấn đề ngược lại, đặt điều này thành false và org.hibernate để cấp ERROR và nó vẫn in thả / tạo / chèn / chọn
Kalpesh Soni

5

Đã dịch câu trả lời được chấp nhận cho YAML làm việc cho tôi

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

3
Bạn cũng có thể sử dụng các thuộc tính phẳng trong YAML nếu bạn không muốn lồng cho các đạo cụ sử dụng một lần, như: logging.level.org.hibernate.SQL: TRACE logging.level.org.hibernate.type.descriptor.sql.BasicBinder: TRACE
MarcinJ

4

Chúng tôi có thể sử dụng bất kỳ một trong số này trong tệp application.properIES :

spring.jpa.show-sql=true 

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

hoặc là

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

Nếu bạn muốn xem các tham số thực tế được sử dụng để truy vấn, bạn có thể sử dụng

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

Sau đó lưu ý rằng giá trị tham số thực tế được hiển thị là 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

Đăng nhập vào đầu ra tiêu chuẩn

Thêm vào application.properties

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

Đây là cách đơn giản nhất để in các truy vấn SQL mặc dù nó không ghi lại các tham số của các câu lệnh đã chuẩn bị. Và nó không được khuyến khích vì nó không như khung đăng nhập được tối ưu hóa.

Sử dụng khung ghi nhật ký

Thêm vào 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

Bằng cách chỉ định các thuộc tính trên, các mục nhật ký sẽ được gửi đến trình bổ sung nhật ký được cấu hình như log-back hoặc log4j.


0

Nếu bạn gặp sự cố với cài đặt này và đôi khi nó có vẻ hoạt động chứ không phải lần khác - hãy xem xét liệu thời gian nó không hoạt động trong các bài kiểm tra đơn vị.

Nhiều người khai báo các thuộc tính thời gian thử nghiệm tùy chỉnh thông qua @TestPropertySourceschú thích được khai báo ở đâu đó trong hệ thống phân cấp kế thừa thử nghiệm của bạn. Điều này sẽ ghi đè bất cứ thứ gì bạn đặt trong application.propertiescài đặt thuộc tính sản xuất của bạn hoặc các giá trị sản xuất khác mà bạn đang cài đặt đang bị bỏ qua một cách hiệu quả tại thời điểm thử nghiệm.


0

Đưa spring.jpa.properties.hibernate.show_sql=truevào application.properations không giúp được luôn.

Bạn có thể thử thêm properties.put("hibernate.show_sql", "true");vào các thuộc tính của cấu hình cơ sở dữ liệu.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.