최대 절전 모드 사용 시 매개 변수 값으로 쿼리 문자열을 인쇄하는 방법
최대 절전 모드에서 생성된 SQL 쿼리를 물음표 대신 실제 값으로 인쇄할 수 있는가?
최대 절전 모드 API를 사용할 수 없는 경우 실제 값으로 쿼리를 인쇄하는 방법을 제안하시겠습니까?
다음 범주에 대해 로깅을 실행하십시오.
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 프록시 드라이버를 사용하는 것이다.
편의를 위해 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
스프링 부트를 사용하는 경우 다음을 구성하십시오.
application.yml
logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.type: TRACE
application.properties
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
그 이상도 없다.
당신의 로그는 다음과 같은 것이 될 것이다.
2020-12-07 | DEBUG | o.h.SQL:127 - insert into Employee (id, name, title, id) values (?, ?, ?, ?)
2020-12-07 | TRACE | o.h.t.d.s.BasicBinder:64 - binding parameter [1] as [VARCHAR] - [001]
2020-12-07 | TRACE | o.h.t.d.s.BasicBinder:64 - binding parameter [2] as [VARCHAR] - [John Smith]
2020-12-07 | TRACE | o.h.t.d.s.BasicBinder:52 - binding parameter [3] as [VARCHAR] - [null]
2020-12-07 | TRACE | o.h.t.d.s.BasicBinder:64 - binding parameter [4] as [BIGINT] - [1]
변화하다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
Log4JDBC는 여기서 가장 인기 있는 답이 아닌 파라미터를 사용하여 데이터베이스로 가는 정확한 SQL을 출력하는 좋은 솔루션이다.이것의 주요한 편리함 중 하나는 당신이 당신의 DB 프런트 엔드에 바로 SQL을 복사하여 그대로 실행할 수 있다는 것이다.
후자는 또한 질의 결과에 대한 표의 표현을 출력한다.
생성된 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 - |---|--------|--------|-----------|----------|---------|-------|
2016년 업데이트
가장 최근에 나는 지금 사용하고 있다.log4jdbc-log4j2
(https://code.google.com/archive/p/log4jdbc-log4j2/ )(SLF4j 포함)logback
설치에 필요한 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>
드라이버 및 DB URL의 모양:
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>
결국, 나는 이름이 붙은 파일을 만들어야 했다.log4jdbc.log4j2.properties
예를 들어, 수업 경로의 근저에src/test/resources
또는 Maven 프로젝트의 src/main/리소스.이 파일의 행은 다음과 같다.
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>
내가 이 게시물에서 설명한 것처럼 데이터 소스-프록시를 사용하여 할 수 있다.
애플리케이션에서 다음 작업을 예상한다고 가정할 때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
쿼리는 매개 변수 값을 포함하며, 통합 테스트에서 바로 N+1 쿼리 문제를 파악할 수 있도록 사용자 정의 JDBC 문 가로채기를 추가할 수도 있다.
다음 항목을 log4j 또는 logback 구성에 추가하십시오.
org.hibernate.sql=DEBUG
org.hibernate.type.descriptor.sql.BasicBinder=TRACE
켜다org.hibernate.type
실제 파라미터가 물음표에 어떻게 결합되는지 알아보기 위해 로거.
Wildfly를)와의 .standalone.xml
(), 다음 로거 추가:
<logger category="org.hibernate.SQL">
<level name="DEBUG"/>
</logger>
<logger category="org.hibernate.type.descriptor.sql">
<level name="TRACE"/>
</logger>
<!-- 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>
다음은 로그4j. 파일의 속성 아래에 설정된 나에게 효과가 있는 기능이다.
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
최대 절전 모드 속성 설정:
hibernate.show_sql=true
솔루션은 올바르지만 결과 객체에 대한 모든 바인딩도 기록한다.이를 방지하기 위해 별도의 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>
이 대답은 그 질문에 대한 약간의 차이점이다.때때로 우리는 런타임에 디버그 목적으로만 SQL이 필요하다.그럴 경우 편집기에서 디버그를 사용하는 보다 쉬운 방법이 있다.
- 에 중단점을 두다.
org.hibernate.loader.Loader.loadEntityBatch
(또는 스택에서 끝까지 탐색); - 실행이 일시 중단된 경우 변수의 값을 확인하십시오.
this.sql
겨울잠 3시야.나는 이것이 다른 버전에서는 효과가 있을지 잘 모르겠다.
MySQL JDBC 드라이버는 이미 이 요구 사항을 충족하는 편리한 기능을 제공하고 있다. 5.1 한다 적어도 5.1.6의 JAR 버전 참조).mysql-connect-jar-5.1.6.jar
)
- 설정하다
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
로깅:
사용자 지정 로깅 코드 작성:
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 his.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
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/
<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>
최대 절전 모드를 사용하여 생성된 SQL 쿼리를 물음표가 아닌 실제 값으로 인쇄하려면 다음 항목을 추가하십시오.hibernate.cfg.xml/hibernate.properties
:
show_sql=true
format_sql=true
use_sql_comments=true
을 다다익선 에 한다.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
로깅은 효과가 있지만 정확히 네가 원하는 것은 아니었고 나도 얼마 전에 원했지만, P6Spy는 완벽하게 작동한다.
여기에 구현하기 위한 간단한 자습서도 있다.나에게 그것은 매력적으로 작용했다.
- P6Spy 라이브러리 다운로드: 가져오기
- 추출: 추출:
p6spy-install.jar
파일, 찾기p6spy.jar
그리고spy.properties
- 라이브러리 종속성 추가:추가하다
p6spy.jar
프로젝트 라이브러리 종속성으로 전환 - 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> <!-- note the difference -->
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myuser</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> <!-- note the difference -->
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myuser</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 속성 파일 수정:
spy.properties
교체:realdriver
기존 MySQL JDBC 드라이버 사용
realdriver=com.mysql.jdbc.Driver
# specifies another driver to use
realdriver2=
# specifies a third driver to use
realdriver3=
에서 로그 파일 위치 변경logfile
재 모든 이 이 모든 SQL 문이 이 파일에 기록될 것이다.
Windows:
logfile=c:/spy.log
UNIX:
logfile=/srv/log/spy.log
- 프로젝트 클래스 경로로 복사:복사하다
spy.properties
프로젝트 루트 폴더로 이동하십시오.프로젝트가 위치를 찾을 수 있는지 확인spy.properties
a이다.spy.properties file not found
예외가 발생할 것이다.
최대 절전 모드 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-logging
최대 절전 모드에서 사용하는 프레임워크를 로그 통과하기 위해 구성해야 함slf4j
과 같은 애플리케이션의 VM 인수에 다음과 같은 인수를 추가했다.
-Dorg.jboss.logging.provider=slf4j
그리고 그것은 매력적으로 작용했다.
여기에 나와 있는 모든 답변이 도움이 되지만, Spring 애플리케이션 컨텍스트 XML을 사용하여 세션 팩토리를 설정하는 경우 log4j SQL 수준 변수를 설정하는 것이 동면 설정 방법의 일부만 제공할 뿐이며, 동면 모드도 설정해야 한다.Show_sql 변수는 앱 컨텍스트 자체에서 최대 절전 모드(Heaviate)를 사용하여 값을 실제로 표시하기 시작한다.
ApplicationContext.xml의 구성 요소:
<property name="hibernateProperties">
<value>
hibernate.jdbc.batch_size=25
... <!-- Other parameter values here -->
hibernate.show_sql=true
</value>
</property>
로그4j 파일 요구 사항
log4j.logger.org.hibernate.SQL=DEBUG
Java의 경우:
CriteriaQuery(javax.persistence)인 경우 TypeQuery에서 쿼리를 변환하십시오.
다음:
query.probrap(discernatic.Query.class).getQueryString();
최대 절전 모드 3.2.X를 사용하는 경우 다음을 사용하십시오.
log4j.logger.org.hibernate.SQL=trace
대신:
log4j.logger.org.hibernate.SQL=debug
최대 절전 모드에서는 쿼리와 해당 파라미터 값이 서로 다른 줄로 표시된다.
사용 중인 경우application.properties
에서는 아래 표시된 를 Spring Booth 에서 사용할 수 .application.properties
.
org.hibernate.SQL
쿼리 표시:logging.level.org.hibernate.SQL=DEBUG
org.hibernate.type
모든 매개변수 값을 표시하며, 이 값은 다음 항목과 함께 매핑된다.select
insert
그리고update
질의logging.level.org.hibernate.type=TRACE
org.hibernate.type.EnumType
열거형 매개 변수 값 표시:logging.level.org.hibernate.type.EnumType=TRACE
출력 예:
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=TRACE
출력 예:
* 2018-06-14 11:28:29,750 TRACE [http-nio-9891-exec-2] [BasicBinder.java : 65] binding parameter [1] as [BOOLEAN] - [true] * 2018-06-14 11:28:29,751 TRACE [http-nio-9891-exec-2] [BasicBinder.java : 65] binding parameter [2] as [INTEGER] - [1] * 2018-06-14 11:28:29,752 TRACE [http-nio-9891-exec-2] [BasicBinder.java : 65] binding parameter [3] as [VARCHAR] - [public]
YAML 속성 사용:
logging.level.org.hibernate:
SQL: DEBUG
type.descriptor.sql.BasicBinder: TRACE
다음과 같이 구성해야 함:
# Hibernate logging options (INFO only shows startup messages)
log4j.logger.org.hibernate=INFO
# Log JDBC bind parameter runtime arguments
log4j.logger.org.hibernate.type=trace
다음을 기록할 수 있다.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 )
Wireshark 또는 유사한 기능 사용:
위에 언급된 답변 중 파라미터가 있는 SQL을 제대로 출력하지 못하거나, SQL을 제대로 작동시키는 것이 골칫거리다.애플리케이션에서 Oracle/My로 전송되는 모든 SQL/Command를 캡처하는 WireShark를 사용하여 이를 달성했다.쿼리를 포함한 SQL 등.
나에게 가장 간단한 해결책은 매개변수 입력을 매개변수 값으로 대체하기 위한 규칙적인 문자열 대체 구현이다(모든 매개변수를 문자열로 사용, 단순성을 위해).
String debuggedSql = sql;
// then, for each named parameter
debuggedSql = debuggedSql.replaceAll(":"+key, "'"+value.toString()+"'");
// and finally
System.out.println(debuggedSql);
또는 위치 파라미터(?)와 유사한 것.
실행 준비 SQL을 기록하려면 null 값과 날짜와 같은 특정 값 유형을 관리하십시오.
'programing' 카테고리의 다른 글
값 쌍의 Java 컬렉션?(튜플이요?) (0) | 2022.04.23 |
---|---|
Vuejs는 이것을 타이프로 표현한다.$refs..값이 존재하지 않음 (0) | 2022.04.23 |
작성 및 읽기 작업에 동일한 양식을 사용 (0) | 2022.04.23 |
클래스 이름을 사용하여 인스턴스 생성 및 생성자 호출 (0) | 2022.04.23 |
mockMvc를 사용하여 응답 본문에서 문자열을 확인하는 방법 (0) | 2022.04.23 |