क्या हाइबरनेट में प्रश्न चिह्न के बजाय वास्तविक मानों के साथ उत्पन्न एसक्यूएल प्रश्नों को प्रिंट करना संभव है?
यदि आप हाइबरनेट एपीआई के साथ संभव नहीं है, तो आप वास्तविक मूल्यों के साथ प्रश्नों को कैसे प्रिंट करने का सुझाव देंगे?
क्या हाइबरनेट में प्रश्न चिह्न के बजाय वास्तविक मानों के साथ उत्पन्न एसक्यूएल प्रश्नों को प्रिंट करना संभव है?
यदि आप हाइबरनेट एपीआई के साथ संभव नहीं है, तो आप वास्तविक मूल्यों के साथ प्रश्नों को कैसे प्रिंट करने का सुझाव देंगे?
जवाबों:
आपको निम्न श्रेणियों के लिए लॉगिंग सक्षम करने की आवश्यकता है :
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 का उपयोग करना होगा ।
org.hibernate.type.descriptor.sql.BasicBinder
लकड़हारे का उपयोग कर सकते हैं । org.hibernate.type
मेरे लिए बहुत अधिक बेकार जानकारी पर लॉगिंग को सक्षम करना ...
org.hibernate.type
और org.hibernate.loader.hql
मापदंडों को दिखाने के लिए मेरे लिए काम नहीं
बस सुविधा के लिए, यहां लॉगबैक (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
इसमें बदलें 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
binding parameter [1] as [VARCHAR] - [1]
।
वसंत बूट के मामले में इस्तेमाल किया जा रहा है, बस इसे कॉन्फ़िगर करें:
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
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 |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|
आप 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>
अपने log4j या लॉगबैक कॉन्फ़िगरेशन में निम्नलिखित गुण और मान जोड़ें:
org.hibernate.sql=DEBUG
org.hibernate.type.descriptor.sql.BasicBinder=TRACE
org.hibernate.type.descriptor.sql.BasicBinder
श्रेणी सभी मापदंडों, जैसे enum प्रकार शामिल नहीं है। इसलिए यदि आप सब कुछ चाहते हैं, तो आपको वास्तव TRACE
में पूरे org.hibernate.type
समूह की आवश्यकता है।
जैसा कि मैंने इस पोस्ट में वर्णित है, आप डेटा स्रोत-प्रॉक्सी का उपयोग करके कर सकते हैं ।
यह मानते हुए कि आपका आवेदन एक 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 क्वेरी मुद्दों को पकड़ने ।
चालू करो org.hibernate.type
लॉगर देखने के लिए कि प्रश्न के निशान पर वास्तविक पैरामीटर कैसे बाँधते हैं।
<!-- 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>
समाधान सही है, लेकिन परिणाम वस्तुओं के लिए सभी बाइंडिंग भी लॉग करता है। इसे रोकने के लिए एक अलग परिशिष्ट बनाने और फ़िल्टर करने में सक्षम करने के लिए यह छोटा है, उदाहरण के लिए:
<!-- 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>
**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
यह उत्तर प्रश्न के लिए थोड़ा विचरण है। कभी-कभी, हमें रनवे में केवल डीबग उद्देश्यों के लिए ही sql की आवश्यकता होती है। उस मामले में, संपादकों पर डिबग का उपयोग करते हुए, एक और आसान तरीका है।
यह हाइबरनेट 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();
}
}
मुझे यह 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
लॉगिंग कार्य करता है, लेकिन वास्तव में आप चाहते हैं या मैं कुछ समय पहले नहीं चाहता था, लेकिन P6Spy पूरी तरह से काम करता है ,
यहाँ P6Spy के लिए MKYONG ट्यूटोरियल को लागू करने के लिए सरल ट्यूटोरियल है ।
मेरे लिए यह आकर्षण की तरह काम करता था।
p6spy-install.jar
फ़ाइल निकालें , देखें p6spy.jar
औरspy.properties
p6spy.jar
अपनी प्रोजेक्ट लाइब्रेरी निर्भरता में जोड़ें
अपनी डेटाबेस कॉन्फ़िगरेशन फ़ाइल को संशोधित करें। आपको अपने मौजूदा 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>
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
“spy.properties”
प्रोजेक्ट क्लासपाथ पर कॉपी करें“spy.properties”
अपने प्रोजेक्ट रूट फ़ोल्डर में कॉपी करें, सुनिश्चित करें कि आपका प्रोजेक्ट "spy.properties" का पता लगा सकता है, अन्यथा यह “spy.properties”
फ़ाइल को अपवाद नहीं मिला।
<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>
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
और यह एक आकर्षण की तरह काम करता था।
आप इसे लॉग इन कर सकते हैं:
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 )
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/
Wireshark या कुछ इसी तरह का प्रयोग करें :
उपर्युक्त उत्तरों में से कोई भी मापदंडों के साथ एसक्यूएल को ठीक से नहीं छापेगा या दर्द नहीं होगा। मैंने वायरशर्क का उपयोग करके इसे प्राप्त किया , जो कि सभी एसक्यूएल / कमांड को एप्लिकेशन से ओरेकल / मैसकल आदि प्रश्नों के साथ भेजा जा रहा है।
यहाँ सभी उत्तर उपयोगी हैं, लेकिन यदि आप अपने सत्र कारखाने को सेटअप करने के लिए स्प्रिंग एप्लीकेशन के संदर्भ 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
जावा में:
यदि यह एक मानदंड (javax.persistence) है, तो TypedQuery में अपनी क्वेरी को ट्रांसफ़ॉर्म करें।
फिर:
query.unwrap (org.hibernate.Query.class) .getQueryString ();
हाइबरनेट विभिन्न लाइनों में क्वेरी और उनके पैरामीटर मान दिखाता है।
यदि आप स्प्रिंग बूट में application.properties का उपयोग कर रहे हैं और आप application.properties में हाइलाइट किए गए पैरामीटर का उपयोग कर सकते हैं।
org.hibernate.SQL प्रश्न दिखाएगा
org.hibernate.type सभी पैरामीटर मान दिखाएगा, जो प्रश्नों का चयन, सम्मिलित और अद्यतन करने के साथ मैप करेगा। logging.level.org.hibernate.type = ट्रेस
org.hibernate.type.EnumType enum टाइप पैरामीटर मान दिखाएगा
उदाहरण ::
2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
sql.BasicBinder पूर्णांक, varchar, बूलियन प्रकार पैरामीटर मान दिखाएगा
उदाहरण ::
मेरे लिए सबसे सरल समाधान पैरामीटर इनपुट को पैरामीटर मान के साथ बदलने के लिए एक नियमित स्ट्रिंगरेल लागू कर रहा है (सभी मापदंडों को स्ट्रिंग के रूप में सरलता के लिए मानते हुए):
String debugedSql = sql;
//then, for each named parameter
debugedSql = debugedSql.replaceAll(":"+key, "'"+value.toString()+"'");
//and finnaly
println(debugedSql);
या स्थितिगत मापदंडों (?) के लिए समान है।
यदि आप एक रन रेडी लॉग इन करना चाहते हैं, तो शून्य मानों और दिनांक जैसे विशिष्ट मूल्य प्रकारों का ध्यान रखें।