स्प्रिंग बूट में SQL स्टेटमेंट कैसे लॉग करें?


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
लेकिन यह केवल कुछ बाइंड मानों को लॉग करता है। मैं मानदंड-एपीआई से मूल्यों को कैसे लॉग कर सकता हूं? यदि मैं विशिष्टताओं का उपयोग करता हूं, तो मुझे क्राइटेरियाब्यूरल के साथ निर्मित बाध्य मापदंडों के लिए कोई आउटपुट नहीं मिलता है।
जोश

204

स्टडआउट के लिए भी यह काम करता है:

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 को लिखता है
मुहम्मद हेविडी

4
मैं अभी भी केवल ?मापदंडों के बजाय देखता हूं । क्या वह समाधान उन्हें मुझे दिखाने वाला था?
Adeynack

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

परिशिष्ट रेफरी उस परिशिष्ट का नाम है जिसे आपने लॉगबैक xml में परिभाषित किया है। यह केवल एक चर है
राजा अन्बझगन

17

चूंकि यह एक बहुत ही सामान्य प्रश्न है, इसलिए मैंने यह लेख लिखा है , जिस पर यह उत्तर आधारित है।

से बचने के लिए सेटिंग्स

आपको इस सेटिंग का उपयोग नहीं करना चाहिए:

spring.jpa.show-sql=true 

इसके साथ समस्या show-sqlयह है कि SQL स्टेटमेंट कंसोल में प्रिंट किए जाते हैं, इसलिए उन्हें फ़िल्टर करने का कोई तरीका नहीं है, जैसा कि आप सामान्य रूप से लॉगिंग ढांचे के साथ करते हैं।

हाइबरनेट लॉगिंग का उपयोग करना

अपनी लॉग कॉन्फ़िगरेशन फ़ाइल में, यदि आप निम्न लकड़हारा जोड़ते हैं:

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

फिर, JDBC PreparedStatementबनाए जाने पर हाइबरनेट SQL स्टेटमेंट्स को प्रिंट करेगा । इसीलिए पैरामीटर प्लेसहोल्डर्स का उपयोग करके स्टेटमेंट लॉग किया जाएगा:

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]

डेटा स्रोत-प्रॉक्सी का उपयोग करना

डेटा स्रोत-प्रॉक्सी प्रॉक्सी वास्तविक JDBC करने की अनुमति देता DataSourceके रूप में निम्न आरेख से दिखाया गया है:

डेटा स्रोत-प्रॉक्सी

आप dataSourceबीन को परिभाषित कर सकते हैं जिसका उपयोग हाइबरनेट द्वारा निम्नानुसार किया जाएगा:

@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 सर्वर JDBC ड्राइवर) के लिए।

प्रयोग करके देखें:

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

आपके आवेदन में।

मेरी व्यक्तिगत प्राथमिकता सेट करना है:

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.

मेरे पास रिवर्स समस्या है, इसे गलत पर सेट करना, और ERROR को org.hibernate और उसके अभी भी प्रिंटिंग ड्रॉप / क्रिएट / इंसर्ट / सलेक्ट करना
कल्पेश सोनी

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

यह एसक्यूएल प्रश्नों को प्रिंट करने का सबसे सरल तरीका है, हालांकि यह तैयार किए गए कथनों के मापदंडों को लॉग नहीं करता है। और इसकी अनुशंसा नहीं की जाती है क्योंकि इसके रूप में अनुकूलित लॉगिंग फ्रेमवर्क नहीं है।

लॉगिंग फ्रेमवर्क का उपयोग करना

में जोड़े 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

उपरोक्त गुणों को निर्दिष्ट करके, लॉग प्रविष्टियों को लॉग-बैक या लॉग 4 जे जैसे कॉन्फ़िगर लॉग ऐपेंडर में भेजा जाएगा।


0

यदि आपको इस सेटिंग से परेशानी हो रही है और यह कभी-कभी काम करने लगता है, तो दूसरी बार नहीं - विचार करें कि क्या वह समय नहीं है जहाँ यह इकाई परीक्षणों के दौरान काम नहीं करता है।

कई लोग @TestPropertySourcesआपके टेस्ट इनहेरिटेंस पदानुक्रम में कहीं न कहीं घोषित एनोटेशन के माध्यम से कस्टम टेस्ट-टाइम गुणों की घोषणा करते हैं। यह आपके application.propertiesया अन्य उत्पादन गुणों की सेटिंग में जो कुछ भी डाल देगा, उसे ओवरराइड कर देगा ताकि आपके द्वारा स्थापित किए जा रहे मूल्यों को प्रभावी ढंग से परीक्षण-समय पर अनदेखा किया जा सके।


0

Application.properties spring.jpa.properties.hibernate.show_sql=trueमें लाना हमेशा मदद नहीं करता था।

आप 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.