답변:
다음 범주에 대한 로깅 을 활성화해야합니다 .
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
레거시 속성 과 동일 하고 두 번째 는 다른 것들 중에서 바인딩 된 매개 변수를 인쇄합니다.
최대 절전 모드 기반이 아닌 다른 솔루션은 P6Spy 와 같은 JDBC 프록시 드라이버를 사용하는 것 입니다.
org.hibernate.type.descriptor.sql.BasicBinder
로거 를 사용할 수 있습니다 . 로그인을 활성화 org.hibernate.type
하면 나에게 쓸모없는 정보가 너무 많이 인쇄되었습니다.
org.hibernate.type
및 org.hibernate.loader.hql
매개 변수를 보여주기 위해 나를 위해 작동하지
편의상 Logback (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"에 log4j 및 아래 항목을 포함하십시오.
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는 정확한 것을 인쇄하는 훌륭한 솔루션입니다. 데이터베이스에가는 SQL 하지 않는 가장 인기있는 답변이 아닌 매개 변수로 . 이것의 한 가지 주요 편의점은 SQL을 DB 프론트 엔드에 바로 복사하여 그대로 실행할 수 있다는 것입니다.
http://log4jdbc.sourceforge.net/
https://code.google.com/p/log4jdbc-remix/
후자는 또한 쿼리 결과를 표 형식으로 출력합니다.
쿼리의 결과 세트 테이블과 함께 매개 변수가있는 생성 된 SQL을 보여주는 샘플 출력 :
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 및 logback과 함께 log4jdbc-log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ )를 사용하고 있습니다. 설정에 필요한 Maven 종속성은 다음과 같습니다.
<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>
그러면 Driver와 DB Urls는 다음과 같습니다.
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 구성 파일은 다음과 같습니다. 그러면 모든 쿼리에 대한 매개 변수와 결과 집합 테이블이있는 모든 SQL 문이 출력됩니다.
<?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>
마지막으로 클래스 경로의 루트 (예 : Mevn 프로젝트의 src / test / resources 또는 src / main / resources)에 log4jdbc.log4j2.properties라는 파일을 작성해야했습니다. 이 파일에는 아래의 한 줄이 있습니다.
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 또는 logback 구성에 다음 특성 및 값을 추가하십시오.
org.hibernate.sql=DEBUG
org.hibernate.type.descriptor.sql.BasicBinder=TRACE
org.hibernate.type.descriptor.sql.BasicBinder
범주에는 열거 형과 같은 모든 매개 변수가 포함되지 않습니다. 따라서 모든 것을 원한다면 실제로 TRACE
전체 org.hibernate.type
그룹 이 필요 합니다 .
이 게시물 에서 설명한 것처럼 datasource-proxy를 사용하여 수행 할 수 있습니다 .
애플리케이션이 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 문 인터셉터를 추가 할 수 있습니다 바로 통합 테스트에서 N + 1 쿼리 문제를 잡아 .
<!-- 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>
솔루션은 정확하지만 결과 개체에 대한 모든 바인딩도 기록합니다. 이를 방지하기 위해 별도의 appender를 작성하고 필터링을 사용하는 것이 가능합니다. 예를 들면 다음과 같습니다.
<!-- 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
mysql jdbc 드라이버는 이미이 요구 사항을 충족시키는 편리한 기능을 제공하고 있습니다. 최소한 jar 버전이> = 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 로깅을 사용하려면 slf4j-api, slf4j-log4j12 종속성을 추가해야합니다.
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-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=
로그 파일 위치 변경 logfile 특성에서 로그 파일 위치를 변경하면 모든 SQL 문이이 파일에 로그인합니다.
윈도우
logfile = c:/spy.log
*아니야
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.xml 구성에 다음을 추가하려고했습니다.
<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 )
여기에있는 모든 대답이 도움이되지만 Spring 응용 프로그램 컨텍스트 XML을 사용하여 세션 팩토리를 설정하는 경우 log4j SQL 수준 변수를 설정하면 거기에있는 방법의 일부만 얻을 수 있으며 hibernate.show_sql 변수도 설정해야합니다 앱 컨텍스트 자체에서 Hibernate가 실제로 값을 표시하기 시작합니다.
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
자바에서 :
CriteriaQuery (javax.persistence) 인 경우 TypedQuery에서 쿼리를 변환하십시오.
그때:
query.unwrap (org.hibernate.Query.class) .getQueryString ();
최대 절전 모드는 쿼리와 해당 매개 변수 값을 다른 줄에 표시합니다.
스프링 부트에서 application.properties를 사용하고 있고 application.properties에서 아래 강조 표시된 매개 변수를 사용할 수있는 경우
org.hibernate.SQL은 쿼리를 보여줄 것이다
org.hibernate.type은 모든 매개 변수 값을 보여 주며, select, insert 및 update 쿼리로 매핑됩니다. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType은 열거 형 매개 변수 값을 보여줍니다
예 ::
2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
sql.BasicBinder는 정수, varchar, 부울 유형 매개 변수 값을 표시합니다
예 ::
가장 간단한 해결책은 일반 stringReplace를 구현하여 매개 변수 입력을 매개 변수 값으로 바꾸는 것입니다 (간단하게 모든 매개 변수를 문자열로 처리).
String debugedSql = sql;
//then, for each named parameter
debugedSql = debugedSql.replaceAll(":"+key, "'"+value.toString()+"'");
//and finnaly
println(debugedSql);
또는 위치 매개 변수 (?)와 유사한 것.
실행 준비된 SQL을 기록하려면 널값 및 날짜와 같은 특정 값 유형을 관리하십시오.