हाइबरनेट का उपयोग करते समय पैरामीटर मान के साथ क्वेरी स्ट्रिंग कैसे प्रिंट करें


393

क्या हाइबरनेट में प्रश्न चिह्न के बजाय वास्तविक मानों के साथ उत्पन्न एसक्यूएल प्रश्नों को प्रिंट करना संभव है?

यदि आप हाइबरनेट एपीआई के साथ संभव नहीं है, तो आप वास्तविक मूल्यों के साथ प्रश्नों को कैसे प्रिंट करने का सुझाव देंगे?


जवाबों:


425

आपको निम्न श्रेणियों के लिए लॉगिंग सक्षम करने की आवश्यकता है :

  • org.hibernate.SQL   - debugसभी SQL DML स्टेटमेंट्स को लॉग करने के लिए सेट करें क्योंकि वे निष्पादित होते हैं
  • org.hibernate.type- traceसभी JDBC मापदंडों को लॉग करने के लिए सेट करें

तो एक log4j विन्यास की तरह लग सकता है:

# logs the SQL statements
log4j.logger.org.hibernate.SQL=debug 

# Logs the JDBC parameters passed to a query
log4j.logger.org.hibernate.type=trace 

पहला hibernate.show_sql=trueविरासत संपत्ति के बराबर है , दूसरा अन्य चीजों के बीच बाध्य मापदंडों को प्रिंट करता है।

एक अन्य समाधान (गैर हाइबरनेट आधारित) एक JDBC प्रॉक्सी ड्राइवर जैसे P6Spy का उपयोग करना होगा ।


11
यह उपयोगी है। लेकिन यह मुझे वास्तविक एसक्यूएल प्रश्नों को नहीं दिखाता है।
निकोलस बारबुलेसको

6
@ बाइकोलस यह सच है, हालाँकि इस क्वेरी के तुरंत बाद यह बाइंडेड मापदंडों को फैलाता है।
Xtreme बाइकर

2
मैं ४.४.४ और हाइबरनेट का उपयोग कर रहा हूं। लॉग ४ जे कॉन्फ़िगरेशन बदलना मेरे लिए काम नहीं आया लेकिन p6spy ने काम किया!
शाम

10
हाइबरनेट 5 में हम org.hibernate.type.descriptor.sql.BasicBinderलकड़हारे का उपयोग कर सकते हैं । org.hibernate.typeमेरे लिए बहुत अधिक बेकार जानकारी पर लॉगिंग को सक्षम करना ...
csharpfolk

5
org.hibernate.typeऔर org.hibernate.loader.hqlमापदंडों को दिखाने के लिए मेरे लिए काम नहीं
Dherik

75

बस सुविधा के लिए, यहां लॉगबैक (SLF4J) के लिए समान कॉन्फ़िगरेशन उदाहरण है

<appender name="SQLROLLINGFILE">
 <File>/tmp/sql.log</File>
 <rollingPolicy>
  <FileNamePattern>logFile.%d{yyyy-MM-dd}.log</FileNamePattern>
 </rollingPolicy>
 <layout>
  <Pattern>%-4date | %msg %n</Pattern>
 </layout>
</appender>

<logger name="org.hibernate.SQL" additivity="false" >   
 <level value="DEBUG" />    
 <appender-ref ref="SQLROLLINGFILE" />
</logger>

<logger name="org.hibernate.type" additivity="false" >
 <level value="TRACE" />
 <appender-ref ref="SQLROLLINGFILE" />
</logger>

आपके sql.log (उदाहरण) में आउटपुट तब इस तरह दिखता है:

2013-08-30 18:01:15,083 | update stepprovider set created_at=?, lastupdated_at=?, version=?, bundlelocation=?, category_id=?, customer_id=?, description=?, icon_file_id=?, name=?, shareStatus=?, spversion=?, status=?, title=?, type=?, num_used=? where id=?
2013-08-30 18:01:15,084 | binding parameter [1] as [TIMESTAMP] - 2012-07-11 09:57:32.0
2013-08-30 18:01:15,085 | binding parameter [2] as [TIMESTAMP] - Fri Aug 30 18:01:15 CEST 2013
2013-08-30 18:01:15,086 | binding parameter [3] as [INTEGER] -
2013-08-30 18:01:15,086 | binding parameter [4] as [VARCHAR] - com.mypackage.foo
2013-08-30 18:01:15,087 | binding parameter [5] as [VARCHAR] -
2013-08-30 18:01:15,087 | binding parameter [6] as [VARCHAR] -
2013-08-30 18:01:15,087 | binding parameter [7] as [VARCHAR] - TODO
2013-08-30 18:01:15,087 | binding parameter [8] as [VARCHAR] -
2013-08-30 18:01:15,088 | binding parameter [9] as [VARCHAR] - MatchingStep@com.mypackage.foo
2013-08-30 18:01:15,088 | binding parameter [10] as [VARCHAR] - PRIVATE
2013-08-30 18:01:15,088 | binding parameter [11] as [VARCHAR] - 1.0
2013-08-30 18:01:15,088 | binding parameter [12] as [VARCHAR] - 32
2013-08-30 18:01:15,088 | binding parameter [13] as [VARCHAR] - MatchingStep
2013-08-30 18:01:15,089 | binding parameter [14] as [VARCHAR] -
2013-08-30 18:01:15,089 | binding parameter [15] as [INTEGER] - 0
2013-08-30 18:01:15,089 | binding parameter [16] as [VARCHAR] - 053c2e65-5d51-4c09-85f3-2281a1024f64

2
यह ओपी सवाल का जवाब नहीं दे रहा है।
शैडोगेम

33

इसमें बदलें hibernate.cfg.xml:

<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>

"Log4j.properties" में लॉग 4j और नीचे की प्रविष्टियों को शामिल करें:

log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE

log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout

धन्यवाद, मेरे लिए वास्तव में अच्छा काम किया है। उन सेटिंग्स sql क्वेरी के तहत एक पैरामीटर की तरह जोड़ देगा binding parameter [1] as [VARCHAR] - [1]
जी। सिआर्डिनी

28

वसंत बूट के मामले में इस्तेमाल किया जा रहा है, बस इसे कॉन्फ़िगर करें:

aplication.yml

logging:
  level:
    org.hibernate.SQL: DEBUG
    org.hibernate.type: TRACE

aplication.properties

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

और कुछ नहीं।

HTH


20

Log4JDBC एक अच्छा समाधान है जो सटीक प्रिंट करता है डेटाबेस में जाने एसक्यूएल को करता है जो कि यहां सबसे लोकप्रिय उत्तर के बजाय मापदंडों के साथ है जो ऐसा नहीं करता है। इसकी एक बड़ी सुविधा यह है कि आप एसक्यूएल को सीधे अपने डीबी फ्रंट-एंड पर कॉपी कर सकते हैं और निष्पादित कर सकते हैं।

http://log4jdbc.sourceforge.net/

https://code.google.com/p/log4jdbc-remix/

उत्तरार्द्ध भी क्वेरी परिणामों के सारणीबद्ध प्रतिनिधित्व को आउटपुट करता है।

नमूना आउटपुट दिखाता है जिसमें क्वेरी से परिणाम सेट तालिका के साथ एक साथ परम के साथ एसक्यूएल उत्पन्न होता है:

5. insert into ENQUIRY_APPLICANT_DETAILS (ID, INCLUDED_IN_QUOTE, APPLICANT_ID, TERRITORY_ID, ENQUIRY_ID, ELIGIBLE_FOR_COVER) values (7, 1, 11, 1, 2, 0) 


10 Oct 2013 16:21:22 4953 [main] INFO  jdbc.resultsettable  - |---|--------|--------|-----------|----------|---------|-------|
10 Oct 2013 16:21:22 4953 [main] INFO  jdbc.resultsettable  - |ID |CREATED |DELETED |CODESET_ID |NAME      |POSITION |PREFIX |
10 Oct 2013 16:21:22 4953 [main] INFO  jdbc.resultsettable  - |---|--------|--------|-----------|----------|---------|-------|
10 Oct 2013 16:21:22 4953 [main] INFO  jdbc.resultsettable  - |2  |null    |null    |1          |Country 2 |1        |60     |
10 Oct 2013 16:21:22 4953 [main] INFO  jdbc.resultsettable  - |---|--------|--------|-----------|----------|---------|-------|

अपडेट २०१६

हाल ही में मैं अब SLF4j और लॉगबैक के साथ log4jdbc -log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ ) का उपयोग कर रहा हूं। मेरे सेट-अप के लिए आवश्यक मावेन निर्भरता निम्नानुसार हैं:

<dependency>
    <groupId>org.bgee.log4jdbc-log4j2</groupId>
    <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
    <version>1.16</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>${logback.version}</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>$logback.version}</version>
</dependency>

ड्राइवर और DB उरल्स तब दिखते हैं:

database.driver.class=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
database.url=jdbc:log4jdbc:hsqldb:mem:db_name #Hsql
#database.url=jdbc:log4jdbc:mysql://localhost:3306/db_name 

मेरा logback.xml कॉन्फ़िगरेशन फ़ाइल नीचे की तरह दिखता है: यह मापदंडों के साथ सभी एसक्यूएल बयानों के साथ-साथ सभी प्रश्नों के लिए परिणाम तालिका प्रस्तुत करता है।

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <logger name="jdbc.audit" level="ERROR" />
    <logger name="jdbc.connection" level="ERROR" />
    <logger name="jdbc.sqltiming" level="ERROR" />
    <logger name="jdbc.resultset" level="ERROR" />

    <!-- UNCOMMENT THE BELOW TO HIDE THE RESULT SET TABLE OUTPUT -->
    <!--<logger name="jdbc.resultsettable" level="ERROR" /> -->

    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

अंत में, मुझे classpath के मूल में log4jdbc.log4j2.properties नाम की एक फाइल बनानी थी जैसे src / test / Resources या src / main / resource में एक मेवैन प्रोजेक्ट। इस फ़ाइल में एक पंक्ति है जो नीचे है:

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

उपरोक्त आपके लॉगिंग लाइब्रेरी पर निर्भर करेगा। डॉक्स को https://code.google.com/archive/p/log4jdbc-log4j2 पर देखेंअधिक जानकारी के लिए

नमूना आउटपुट:

10:44:29.400 [main] DEBUG jdbc.sqlonly -  org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)
5. select memberrole0_.member_id as member_i2_12_0_, memberrole0_.id as id1_12_0_, memberrole0_.id 
as id1_12_1_, memberrole0_.member_id as member_i2_12_1_, memberrole0_.role_id as role_id3_12_1_, 
role1_.id as id1_17_2_, role1_.name as name2_17_2_ from member_roles memberrole0_ left outer 
join roles role1_ on memberrole0_.role_id=role1_.id where memberrole0_.member_id=104 

10:44:29.402 [main] INFO  jdbc.resultsettable - 
|----------|---|---|----------|--------|---|-----|
|member_id |id |id |member_id |role_id |id |name |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|

1
अरे .... यह अच्छा लग रहा है .... बस डॉक्टर ने मेरे लिए क्या आदेश दिया :) ... लेकिन क्या यह CLOB / BLOB का भी समर्थन करता है ?? इसके अलावा, क्या केवल क्वेरी प्रदर्शित करना संभव है और परिणाम सेट नहीं। - धन्यवाद :)
देव रे २

1
क्या आप मुझे कॉन्फ़िगरेशन का एक उदाहरण दे सकते हैं कि कैसे करें?
grep

वास्तव में, बाद में क्वेरी परिणामों के सारणीबद्ध प्रतिनिधित्व का उत्पादन होता है ... अर्थात उस अच्छी सुविधा के लिए log4jdbc-remix की आवश्यकता होती है।
मेरिटॉन

यह समाधान मेरी स्थिति के लिए सबसे अच्छा था जहां मुझे पंक्ति संख्या मूल्यों को देखने की आवश्यकता थी हाइबरनेट परिणाम सेट करने के लिए उत्पन्न करता है। ट्रेस लॉगिंग केवल क्वेरी पैरामीटर मान दिखाता है।
ओलिवर हर्नांडेज

@ एलन है क्या यह लॉग इन मूल प्रश्न भी?
सायंतन

9

आप log4j.xml में श्रेणी रेखाएँ जोड़ सकते हैं:

<category name="org.hibernate.type">
    <priority value="TRACE"/>
</category>

और हाइबरनेट गुण जोड़ें:

<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>

7

अपने log4j या लॉगबैक कॉन्फ़िगरेशन में निम्नलिखित गुण और मान जोड़ें:

org.hibernate.sql=DEBUG
org.hibernate.type.descriptor.sql.BasicBinder=TRACE

5
org.hibernate.type.descriptor.sql.BasicBinderश्रेणी सभी मापदंडों, जैसे enum प्रकार शामिल नहीं है। इसलिए यदि आप सब कुछ चाहते हैं, तो आपको वास्तव TRACEमें पूरे org.hibernate.typeसमूह की आवश्यकता है।
सीनाफ

मेरे लिए यह हाइबरनेट 4.3 में काम करता है! इसके अलावा, मैं पूर्ण org.hibernate.type को ट्रेस नहीं करूंगा, क्योंकि यह बहुत अधिक आउटपुट है। ज्यादातर मामलों में, यह समाधान करेगा।
cslotty

ध्यान दें कि org.hibernate.type.descriptor.sql.BasicExtractor परिणाम सेट को लॉग करता है। इसलिए बड़े आकार में प्रवेश करने से ग्रहण में सांत्वना देने के दौरान भी शिथिलता आ सकती है और मुझे लगता है कि यह फ़ाइल में प्रवेश करने के लिए भी आदर्श नहीं है। यही कारण है कि मैं इस समाधान को पसंद करता हूं, यह हाइबरनेट 3 में भी काम करता है। उन लोगों के लिए जो एनुम प्रकारों में रुचि रखते हैं, कृपया उस सटीक वर्ग को आज़माएं जो उन्हें लॉग करता है जब org.hibernate.type = TRACE। फिर org.hibernate.type.xyz.ClassThatLogsEnumParams = TRACE सेट करें।
गाजा

7

जैसा कि मैंने इस पोस्ट में वर्णित है, आप डेटा स्रोत-प्रॉक्सी का उपयोग करके कर सकते हैं

यह मानते हुए कि आपका आवेदन एक dataSourceसेम (जैसे के माध्यम से @Resource) की उम्मीद करता है , यह है कि आप कैसे कॉन्फ़िगर कर सकते हैं datasource-proxy:

<bean id="actualDataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource" init-method="init"
  destroy-method="close">
    <property name="className" value="bitronix.tm.resource.jdbc.lrc.LrcXADataSource"/>
    <property name="uniqueName" value="actualDataSource"/>
    <property name="minPoolSize" value="0"/>
    <property name="maxPoolSize" value="5"/>
    <property name="allowLocalTransactions" value="false" />
    <property name="driverProperties">
        <props>
            <prop key="user">${jdbc.username}</prop>
            <prop key="password">${jdbc.password}</prop>
            <prop key="url">${jdbc.url}</prop>
            <prop key="driverClassName">${jdbc.driverClassName}</prop>
        </props>
    </property>
</bean>

<bean id="proxyDataSource" class="net.ttddyy.dsproxy.support.ProxyDataSource">
    <property name="dataSource" ref="testDataSource"/>
    <property name="listener">
        <bean class="net.ttddyy.dsproxy.listener.ChainListener">
            <property name="listeners">
                <list>
                    <bean class="net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener">
                        <property name="logLevel" value="INFO"/>
                    </bean>
                    <bean class="net.ttddyy.dsproxy.listener.DataSourceQueryCountListener"/>
                </list>
            </property>
        </bean>
    </property>
</bean>

<alias name="proxyDataSource" alias="dataSource"/>

अब हाइबरनेट आउटपुट बनाम डेटासोर्स-प्रॉक्सी:

INFO  [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:1, Num:1, Query:{[select company0_.id as id1_6_, company0_.name as name2_6_ from Company company0_][]}
INFO  [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:0, Num:1, Query:{[insert into WarehouseProductInfo (id, quantity) values (default, ?)][19]}
INFO  [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:0, Num:1, Query:{[insert into Product (id, code, company_id, importer_id, name, version) values (default, ?, ?, ?, ?, ?)][phoneCode,1,-5,Phone,0]}

datasource-proxyप्रश्नों पैरामीटर मान होते हैं और इतनी है कि आप कर सकते हैं यहां तक कि कस्टम JDBC बयान इंटरसेप्टर जोड़ सकते हैं सीधे अपने एकीकरण परीक्षणों से एन 1 क्वेरी मुद्दों को पकड़ने


5

चालू करो org.hibernate.typeलॉगर देखने के लिए कि प्रश्न के निशान पर वास्तविक पैरामीटर कैसे बाँधते हैं।


4

<!-- A time/date based rolling appender -->
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="logs/system.log" />
    <param name="Append" value="true" />
    <param name="ImmediateFlush" value="true" />
    <param name="MaxFileSize" value="200MB" />
    <param name="MaxBackupIndex" value="100" />

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %d{Z} [%t] %-5p (%F:%L) - %m%n" />
    </layout>
</appender>

<appender name="journaldev-hibernate" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="logs/project.log" />
    <param name="Append" value="true" />
    <param name="ImmediateFlush" value="true" />
    <param name="MaxFileSize" value="200MB" />
    <param name="MaxBackupIndex" value="50" />

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %d{Z} [%t] %-5p (%F:%L) - %m%n" />
    </layout>
</appender>

<logger name="com.journaldev.hibernate" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="journaldev-hibernate" />
</logger>

<logger name="org.hibernate" additivity="false">
    <level value="INFO" />
    <appender-ref ref="FILE" />
</logger>

<logger name="org.hibernate.type" additivity="false">
    <level value="TRACE" />
    <appender-ref ref="FILE" />
</logger>

<root>
    <priority value="INFO"></priority>
    <appender-ref ref="FILE" />
</root>


3

समाधान सही है, लेकिन परिणाम वस्तुओं के लिए सभी बाइंडिंग भी लॉग करता है। इसे रोकने के लिए एक अलग परिशिष्ट बनाने और फ़िल्टर करने में सक्षम करने के लिए यह छोटा है, उदाहरण के लिए:

<!-- A time/date based rolling appender -->
<appender name="FILE_HIBERNATE" class="org.jboss.logging.appender.DailyRollingFileAppender">
    <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
    <param name="File" value="${jboss.server.log.dir}/hiber.log"/>
    <param name="Append" value="false"/>
    <param name="Threshold" value="TRACE"/>
    <!-- Rollover at midnight each day -->
    <param name="DatePattern" value="'.'yyyy-MM-dd"/>

    <layout class="org.apache.log4j.PatternLayout">
        <!-- The default pattern: Date Priority [Category] Message\n -->
        <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
    </layout>

    <filter class="org.apache.log4j.varia.StringMatchFilter">
        <param name="StringToMatch" value="bind" />
        <param name="AcceptOnMatch" value="true" />
    </filter>
    <filter class="org.apache.log4j.varia.StringMatchFilter">
        <param name="StringToMatch" value="select" />
        <param name="AcceptOnMatch" value="true" />
    </filter>  
    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender> 

<category name="org.hibernate.type">
  <priority value="TRACE"/>
</category>

<logger name="org.hibernate.type">
   <level value="TRACE"/> 
   <appender-ref ref="FILE_HIBERNATE"/>
</logger>

<logger name="org.hibernate.SQL">
   <level value="TRACE"/> 
   <appender-ref ref="FILE_HIBERNATE"/>
</logger>

3
**If you want hibernate to print generated sql queries with real values instead of question marks.**
**add following entry in hibernate.cfg.xml/hibernate.properties:**
show_sql=true
format_sql=true
use_sql_comments=true

**And add following entry in log4j.properties :**
log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout

अरे सिंगल31 से ऊपर की लाइनों को आपकी हाइबरनेट कॉन्फ़िगरेशन फ़ाइल में जोड़ा जाना है तो यह निश्चित रूप से काम करेगा। मैं हमेशा वह चीज पोस्ट करता हूं जो मैंने व्यावहारिक रूप से की है।
विजय भट्ट

3

यह उत्तर प्रश्न के लिए थोड़ा विचरण है। कभी-कभी, हमें रनवे में केवल डीबग उद्देश्यों के लिए ही sql की आवश्यकता होती है। उस मामले में, संपादकों पर डिबग का उपयोग करते हुए, एक और आसान तरीका है।

  • Org.hibernate.loader.Loader.loadEntityBatch पर एक विराम बिंदु रखें (या जब तक स्टैक पर नेविगेट न करें);
  • जब निष्पादन निलंबित हो जाता है, तो चर का मान देखें। एसक्यूएल;

यह हाइबरनेट 3 के लिए है। मुझे यकीन नहीं है कि यह अन्य संस्करणों पर काम करता है।


3

mysql jdbc ड्राइवर ने पहले ही इस आवश्यकता को पूरा करने के लिए एक सुविधाजनक सुविधा प्रदान कर दी है, आपके पास कम से कम जार संस्करण होना चाहिए> = mysql-connect-jar-5.1.6.jar

चरण 1: [लकड़हारा और कस्टम लॉगिंग जोड़ने के लिए अपने jdbc.url को कॉन्फ़िगर करें]

    jdbc.url=jdbc:mysql://host:port/your_db?logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true&profilerEventHandler=com.xxx.CustomLoggingProfilerEventHandler

अब, यह slf4j लॉगिंग का उपयोग कर रहा है, यदि आपका डिफ़ॉल्ट लॉगिंग log4j है, तो आपको slf4j-api, slf4j-log4j12 निर्भरता जोड़ने के लिए slf4j लॉगिंग का उपयोग करना होगा

चरण 2: [अपनी कस्टम लॉगिंग लिखें]

package com.xxx;
import java.sql.SQLException;
import java.util.Properties;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.log.Log;

public class CustomLoggingProfilerEventHandler implements ProfilerEventHandler {
    private Log log;

    public LoggingProfilerEventHandler() {
    }

    public void consumeEvent(ProfilerEvent evt) {
            /**
             * you can only print the sql as        this.log.logInfo(evt.getMessage())
             * you can adjust your sql print log level with: DEBUG,INFO
             * you can also handle the message to meet your requirement
             */ 
            this.log.logInfo(evt);
    }

    public void destroy() {
        this.log = null;
    }

    public void init(Connection conn, Properties props) throws SQLException {
        this.log = conn.getLog();
    }

}

2

मुझे यह log4j के लिए पसंद है:

log4j.logger.org.hibernate.SQL=trace
log4j.logger.org.hibernate.engine.query=trace
log4j.logger.org.hibernate.type=trace
log4j.logger.org.hibernate.jdbc=trace
log4j.logger.org.hibernate.type.descriptor.sql.BasicExtractor=error 
log4j.logger.org.hibernate.type.CollectionType=error 

अरे - यह अच्छा है। लेकिन मुझे लगता है कि यहाँ प्रश्न प्रिंट किए गए हैं? मापदंडों के मूल्यों के साथ पालन किया। चूंकि मेरे पास असीम रूप से कई प्रश्न हैं, इसलिए मुझे कुछ ऐसा चाहिए जो मैं sql संपादक पर कॉपी-पेस्ट कर सकता हूं और उन्हें निष्पादित किया जाएगा। क्या कोई तरीका है जो मैं इस दृष्टिकोण का उपयोग कर सकता हूं। मैं 3 पार्टी पुस्तकालयों के लिए जाने के लिए उत्सुक नहीं हूं। धन्यवाद :)
देव रे

धन्यवाद। मैं उम्मीद कर रहा था कि किसी भी 3 पार्टी समाधान का उपयोग न करें और सीधे हाइबरनेट करें, लेकिन मुझे लगता है कि मेरे पास कोई अन्य विकल्प नहीं है।
देव रे

2

लॉगिंग कार्य करता है, लेकिन वास्तव में आप चाहते हैं या मैं कुछ समय पहले नहीं चाहता था, लेकिन P6Spy पूरी तरह से काम करता है ,

यहाँ P6Spy के लिए MKYONG ट्यूटोरियल को लागू करने के लिए सरल ट्यूटोरियल है ।

मेरे लिए यह आकर्षण की तरह काम करता था।

  1. P6Spy लाइब्रेरी डाउनलोड करें

जाओ "p6spy-install.jar"

  1. इसे निकालें

p6spy-install.jarफ़ाइल निकालें , देखें p6spy.jarऔरspy.properties

  1. पुस्तकालय निर्भरता जोड़ें

p6spy.jarअपनी प्रोजेक्ट लाइब्रेरी निर्भरता में जोड़ें

  1. P6Spy गुण फ़ाइल संशोधित करें

अपनी डेटाबेस कॉन्फ़िगरेशन फ़ाइल को संशोधित करें। आपको अपने मौजूदा JDBC ड्राइवर को P6Spy JDBC ड्राइवर से बदलने की आवश्यकता है -com.p6spy.engine.spy.P6SpyDriver

मूल MySQL JDBC ड्राइवर है - com.mysql.jdbc.Driver

<session-factory>
  <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.password">password</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="show_sql">true</property>
</session-factory>

इसे बदलकर P6Spy JDBC ड्राइवर - com.p6spy.engine.spy.P6SpyDriver

<session-factory>
  <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
  <property name="hibernate.connection.driver_class">com.p6spy.engine.spy.P6SpyDriver
  </property>
  <property name="hibernate.connection.password">password</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="show_sql">true</property>
</session-factory>
  1. P6Spy गुण फ़ाइल संशोधित करें P6Spy गुण फ़ाइल संशोधित करें -spy.properties

real driverअपने मौजूदा MySQL JDBC ड्राइवर से बदलें

realdriver=com.mysql.jdbc.Driver

#specifies another driver to use
realdriver2=
#specifies a third driver to use
realdriver3=

लॉग फ़ाइल स्थान परिवर्तित करें लॉग फ़ाइल स्थान लॉगफ़ाइल गुण में परिवर्तित करें, सभी SQL कथन इस फ़ाइल में लॉग इन करेंगे।

खिड़कियाँ

logfile     = c:/spy.log

* nix

logfile     = /srv/log/spy.log
  1. “spy.properties”प्रोजेक्ट क्लासपाथ पर कॉपी करें

“spy.properties”अपने प्रोजेक्ट रूट फ़ोल्डर में कॉपी करें, सुनिश्चित करें कि आपका प्रोजेक्ट "spy.properties" का पता लगा सकता है, अन्यथा यह “spy.properties”फ़ाइल को अपवाद नहीं मिला।


मेरे स्प्रिंग बूट एप्लिकेशन में यह मेरे लिए सबसे आसान रास्ता था, जहाँ मैं एक यूनिट टेस्ट से उत्पन्न SQL को लॉग इन करने की कोशिश कर रहा था। मैंने ग्रेडल (testCompile 'p6spy: p6spy: 3.8.5') के लिए एक परीक्षण निर्भरता जोड़ी है, जिसमें समायोजित किया गया है। समायोजन। name = com.p6spy.engine.spy.P6SpyDriver, और उसके बाद spy.properties को रिएल्ड्रिवर = org.h2 के साथ जोड़ा। परिणामी लॉग फ़ाइल से पूरा SQL निकालना आसान था। केवल हिचकी यह थी कि H2 उत्पन्न टाइमस्टैम्प प्रारूप को पसंद नहीं करता था।
बजे केन प्रनोविसी

2

<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" 
      value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
    </layout>
</appender>

<logger name="org.hibernate" additivity="false">
    <level value="INFO" />
    <appender-ref ref="console" />
</logger>

<logger name="org.hibernate.type" additivity="false">
    <level value="TRACE" />
    <appender-ref ref="console" />
</logger>


यह प्रश्न से कैसे संबंधित है?
हॉटजस्ट

2

Hibernate 4 और slf4j / log4j2 का उपयोग करते हुए, मैंने अपने log4j2.bml लेंस में निम्नलिखित जोड़ने की कोशिश की:

<Logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace" additivity="false"> 
    <AppenderRef ref="Console"/> 
</Logger> 
<Logger name="org.hibernate.type.EnumType" level="trace" additivity="false"> 
    <AppenderRef ref="Console"/>
</Logger>

लेकिन सफलता के बिना।

मुझे इस धागे के माध्यम से पता चला कि हाइबरनेट द्वारा उपयोग किए जाने वाले jboss- लॉगिंग ढांचे को slf4j के माध्यम से लॉग करने के लिए कॉन्फ़िगर करने की आवश्यकता है। मैंने आवेदन के VM तर्कों में निम्नलिखित तर्क जोड़ा:

-Dorg.jboss.logging.provider=slf4j

और यह एक आकर्षण की तरह काम करता था।


2

यहाँ मेरे लिए काम किया है, log4j.file में संपत्ति के नीचे सेट करें:

log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

हाइबरनेट गुण सेटिंग:

hibernate.show_sql=true

2

Wildfly (स्टैंडअलोन.एक्सएमएल) के साथ विकास के लिए, उन लकड़ियों को जोड़ें:

<logger category="org.hibernate.SQL">
   <level name="DEBUG"/>
</logger>
<logger category="org.hibernate.type.descriptor.sql">
   <level name="TRACE"/>
</logger>

1

यदि आप हाइबरनेट का उपयोग कर रहे हैं 3.2.xx उपयोग

log4j.logger.org.hibernate.SQL=trace

के बजाय

log4j.logger.org.hibernate.SQL=debug 

1

आप इसे लॉग इन कर सकते हैं:

net.sf.hibernate.hql.QueryTranslator

आउटपुट उदाहरण:

2013-10-31 14:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] HQL: select noti.id, noti.idmicrosite, noti.fcaducidad, noti.fpublicacion, noti.tipo, noti.imagen, noti.visible, trad.titulo, trad.subtitulo, trad.laurl, trad.urlnom, trad.fuente, trad.texto  from org.ibit.rol.sac.micromodel.Noticia noti join noti.traducciones trad where index(trad)='ca' and noti.visible='S' and noti.idmicrosite=985 and noti.tipo=3446

2013-10-31 14:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] SQL: select noticia0_.NOT_CODI as x0_0_, noticia0_.NOT_MICCOD as x1_0_, noticia0_.NOT_CADUCA as x2_0_, noticia0_.NOT_PUBLIC as x3_0_, noticia0_.NOT_TIPO as x4_0_, noticia0_.NOT_IMAGEN as x5_0_, noticia0_.NOT_VISIB as x6_0_, traduccion1_.NID_TITULO as x7_0_, traduccion1_.NID_SUBTIT as x8_0_, traduccion1_.NID_URL as x9_0_, traduccion1_.NID_URLNOM as x10_0_, traduccion1_.NID_FUENTE as x11_0_, traduccion1_.NID_TEXTO as x12_0_ from GUS_NOTICS noticia0_ inner join GUS_NOTIDI traduccion1_ on noticia0_.NOT_CODI=traduccion1_.NID_NOTCOD where (traduccion1_.NID_CODIDI='ca' )and(noticia0_.NOT_VISIB='S' )and(noticia0_.NOT_MICCOD=985 )and(noticia0_.NOT_TIPO=3446 )

अरे ... मैं इस दृष्टिकोण के किसी भी उदाहरण नहीं मिल सकता। क्या आप कोई संदर्भ / उदाहरण / ट्यूटोरियल प्रदान कर सकते हैं। और यह अभी भी नवीनतम संस्करणों या हाइबरनेट / लॉग 4 जे के साथ समान है या यह कुछ org.hibernate.QueryTranslator या कुछ बन गया है। धन्यवाद
देव रे

अरे ... मैंने यह कोशिश की, लेकिन यह सेव या अपडेट के साथ काम नहीं करता है। मुझे लगता है कि यह केवल चुनिंदा प्रश्नों के लिए काम करता है, जहां hql से sql का अनुवाद खेल में आता है
dev ray

1

Log4Jdbc प्लगइन आपकी आवश्यकता के लिए सबसे अच्छा होगा। यह निम्नलिखित दिखाता है-

1. Complete SQL query being hit to the db
2. Parameter values being passed to the query
3. Execution time taken by each query

Log4Jdbc को कॉन्फ़िगर करने के लिए नीचे दिए गए लिंक को देखें-

https://code.google.com/p/log4jdbc/

1

Wireshark या कुछ इसी तरह का प्रयोग करें :

उपर्युक्त उत्तरों में से कोई भी मापदंडों के साथ एसक्यूएल को ठीक से नहीं छापेगा या दर्द नहीं होगा। मैंने वायरशर्क का उपयोग करके इसे प्राप्त किया , जो कि सभी एसक्यूएल / कमांड को एप्लिकेशन से ओरेकल / मैसकल आदि प्रश्नों के साथ भेजा जा रहा है।


2
Log4JDBC करेगा। ऊपर देखो।
एलन हे

1

यहाँ सभी उत्तर उपयोगी हैं, लेकिन यदि आप अपने सत्र कारखाने को सेटअप करने के लिए स्प्रिंग एप्लीकेशन के संदर्भ XML का उपयोग कर रहे हैं, तो log4j SQL स्तर चर को सेट करने से आपको केवल उसी तरह से हिस्सा मिलता है, आपको भी hibernate.show_sql चर सेट करना होगा हाइबरनेट को वास्तव में मूल्यों को दिखाने के लिए शुरू करने के लिए ऐप संदर्भ में ही।

ApplicationContext.xml है:

<property name="hibernateProperties">
            <value>
            hibernate.jdbc.batch_size=25
            ... <!-- Other parameter values here -->
            hibernate.show_sql=true
            </value>
 </property>

और आपकी log4j फाइल की जरूरत है

log4j.logger.org.hibernate.SQL=DEBUG

1

जावा में:

यदि यह एक मानदंड (javax.persistence) है, तो TypedQuery में अपनी क्वेरी को ट्रांसफ़ॉर्म करें।

फिर:

query.unwrap (org.hibernate.Query.class) .getQueryString ();


1
धन्यवाद, यह क्वेरी को प्रिंट करता है, लेकिन जो पैरामीटर इसका उपयोग नहीं करता है, मापदंडों को प्रिंट करने का एक तरीका भी है?
लिज़ लम्पेरोउज

0

हाइबरनेट विभिन्न लाइनों में क्वेरी और उनके पैरामीटर मान दिखाता है।

यदि आप स्प्रिंग बूट में application.properties का उपयोग कर रहे हैं और आप application.properties में हाइलाइट किए गए पैरामीटर का उपयोग कर सकते हैं।

  1. org.hibernate.SQL प्रश्न दिखाएगा

    logging.level.org.hibernate.SQL = डीबग

  2. org.hibernate.type सभी पैरामीटर मान दिखाएगा, जो प्रश्नों का चयन, सम्मिलित और अद्यतन करने के साथ मैप करेगा। logging.level.org.hibernate.type = ट्रेस

    • org.hibernate.type.EnumType enum टाइप पैरामीटर मान दिखाएगा

      logging.level.org.hibernate.type.EnumType = ट्रेस

      उदाहरण ::

      2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
    • sql.BasicBinder पूर्णांक, varchar, बूलियन प्रकार पैरामीटर मान दिखाएगा

      logging.level.org.hibernate.type.descriptor.sql.BasicBinder = ट्रेस

      उदाहरण ::

      • 2018-06-14 11: 28: 29,750 TRACE [http-nio-9891-exec-2] [BasicBinder.java: 65] बाध्यकारी पैरामीटर [1] के रूप में [BOOLEAN] - [सच]
      • 2018-06-14 11: 28: 29,751 TRACE [http-nio-9891-exec-2] [BasicBinder.java: 65] बाध्यकारी पैरामीटर [2] के रूप में [INTEGER] - [1]
      • 2018-06-14 11: 28: 29,752 TRACE [http-nio-9891-exec-2] [BasicBinder.java: 65] बाध्यकारी पैरामीटर [3] के रूप में [वाराहार] - [जनता]

1
यहां तक ​​कि यह प्रश्नों में सीमा और ऑफसेट के मूल्यों को नहीं दिखाता है ।
T3rm1

0

मेरे लिए सबसे सरल समाधान पैरामीटर इनपुट को पैरामीटर मान के साथ बदलने के लिए एक नियमित स्ट्रिंगरेल लागू कर रहा है (सभी मापदंडों को स्ट्रिंग के रूप में सरलता के लिए मानते हुए):

 String debugedSql = sql;
 //then, for each named parameter
     debugedSql = debugedSql.replaceAll(":"+key, "'"+value.toString()+"'");
 //and finnaly
 println(debugedSql);

या स्थितिगत मापदंडों (?) के लिए समान है।
यदि आप एक रन रेडी लॉग इन करना चाहते हैं, तो शून्य मानों और दिनांक जैसे विशिष्ट मूल्य प्रकारों का ध्यान रखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.