최대 절전 모드를 사용할 때 매개 변수 값으로 쿼리 문자열을 인쇄하는 방법


답변:


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레거시 속성 과 동일 하고 두 번째 는 다른 것들 중에서 바인딩 된 매개 변수를 인쇄합니다.

최대 절전 모드 기반이 아닌 다른 솔루션은 P6Spy 와 같은 JDBC 프록시 드라이버를 사용하는 것 입니다.


11
유용합니다. 그러나 이것은 실제 SQL 쿼리를 보여주지 않습니다.
니콜라스 Barbulesco

6
그러나 @Nicolas는 사실이지만 쿼리 직후에 바인딩 된 매개 변수를 해제합니다.
Xtreme Biker

2
grails 2.4.4와 최대 절전 모드 4를 사용하고 있습니다. log4j 구성 변경은 효과가 없었지만 p6spy는 작동했습니다!
Champ

10
Hibernate 5에서는 org.hibernate.type.descriptor.sql.BasicBinder로거 를 사용할 수 있습니다 . 로그인을 활성화 org.hibernate.type하면 나에게 쓸모없는 정보가 너무 많이 인쇄되었습니다.
csharpfolk

5
org.hibernate.typeorg.hibernate.loader.hql매개 변수를 보여주기 위해 나를 위해 작동하지
Dherik

75

편의상 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

2
이것은 OP 질문에 대답하지 않습니다.
ShadowGames

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"에 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

고마워, 정말 나를 위해 일했다. 이러한 설정은 SQL 쿼리 아래에와 같은 매개 변수를 추가합니다 binding parameter [1] as [VARCHAR] - [1].
G. Ciardini

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는 정확한 것을 인쇄하는 훌륭한 솔루션입니다. 데이터베이스에가는 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  - |---|--------|--------|-----------|----------|---------|-------|

2016 업데이트

가장 최근에는 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 |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|

1
이봐 ....이 멋진 것 같아 .... 의사가 나를 위해 주문한 :) ...하지만 CLOB / BLOB도 지원합니까 ?? 또한 결과 집합이 아닌 쿼리 만 표시 할 수 있습니다. -감사합니다 :)
dev ray

1
구성 방법의 예를 알려주시겠습니까?
grep

실제로, 후자 는 쿼리 결과의 표 표현을 출력합니다. 즉, 멋진 기능을 위해서는 log4jdbc-remix가 필요합니다.
meriton

이 솔루션은 페이징 결과 세트에 대해 Hibernate가 생성하는 행 번호 값을 확인해야하는 상황에 가장 적합했습니다. 추적 로깅에는 쿼리 매개 변수 값만 표시됩니다.
Oliver Hernandez

@ Alan Hay는이 기본 쿼리도 기록합니까?
Sayantan

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 또는 logback 구성에 다음 특성 및 값을 추가하십시오.

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

5
org.hibernate.type.descriptor.sql.BasicBinder범주에는 열거 형과 같은 모든 매개 변수가 포함되지 않습니다. 따라서 모든 것을 원한다면 실제로 TRACE전체 org.hibernate.type그룹 이 필요 합니다 .
seanf

나를 위해 그것은 최대 절전 모드 4.3에서 작동합니다! 또한 전체 org.hibernate.type을 추적하지 않습니다. 출력이 너무 많기 때문입니다. 대부분의 경우이 솔루션이 가능합니다.
cslotty

org.hibernate.type.descriptor.sql.BasicExtractor는 결과 세트를 기록합니다. 따라서 Eclipse에서 콘솔에 로그인 할 때 큰 항목을 입력하면 응용 프로그램이 중단 될 수 있으며 파일에 로그인하는 데 적합하지 않은 것으로 생각합니다. 그래서이 솔루션을 선호하는 이유는 Hibernate 3에서도 작동합니다. 열거 형에 관심이있는 사람들은 org.hibernate.type = TRACE 일 때이를 기록하는 정확한 클래스를 사용해보십시오. 그런 다음 org.hibernate.type.xyz.TheClassThatLogsEnumParams = TRACE를 설정하십시오.
Géza

7

이 게시물 에서 설명한 것처럼 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 쿼리 문제를 잡아 .


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

솔루션은 정확하지만 결과 개체에 대한 모든 바인딩도 기록합니다. 이를 방지하기 위해 별도의 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>

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 줄 위의 최대 절전 모드 구성 파일에 추가해야합니다. 나는 항상 내가 실제로 한 일을 게시합니다.
Vijay Bhatt

3

이 답변은 질문에 약간의 차이가 있습니다. 때로는 런타임에 디버그 목적으로 만 SQL이 필요합니다. 이 경우 편집기에서 디버그를 사용하여 더 쉬운 방법이 있습니다.

  • org.hibernate.loader.Loader.loadEntityBatch에 중단 점을 두십시오 (또는 스택이있을 때까지 탐색하십시오).
  • 실행이 중지되면 변수 this.sql의 값을보십시오.

이것은 최대 절전 모드 3입니다.이 버전이 다른 버전에서 작동하는지 잘 모르겠습니다.


3

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();
    }

}

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 자 도서관에 가고 싶어하지 않습니다. 감사합니다 :)
dev ray

감사. 타사 솔루션을 사용하지 않고 직접 최대 절전 모드를 사용하지 않기를 바랐지만 다른 선택은 없습니다.
dev ray

2

로깅은 작동하지만 정확히 원하는 것은 아니지만 얼마 전에 원했지만 P6Spy완벽하게 작동 합니다. .

다음은 P6Spy 용 MKYONG 자습서 와 함께 구현하는 간단한 자습서입니다. 입니다.

나를 위해 그것은 매력처럼 일했습니다.

  1. P6Spy 라이브러리 다운로드

“p6spy-install.jar”을 얻습니다

  1. 그것을 추출

추출 p6spy-install.jar, 파일을 찾아 p6spy.jarspy.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=

로그 파일 위치 변경 logfile 특성에서 로그 파일 위치를 변경하면 모든 SQL 문이이 파일에 로그인합니다.

윈도우

logfile     = c:/spy.log

*아니야

logfile     = /srv/log/spy.log
  1. “spy.properties”프로젝트 클래스 경로로 복사

“spy.properties”프로젝트 루트 폴더에 복사 하여 프로젝트가 "spy.properties"를 찾을 수 있는지 확인하십시오. 그렇지 않으면 “spy.properties”파일을 찾을 수 없음 예외가 표시됩니다.


이것은 Spring Boot 응용 프로그램에서 가장 쉬운 방법이었습니다. 단위 테스트에서 생성 된 SQL을 기록하려고했습니다. Gradle (testCompile 'p6spy : p6spy : 3.8.5')에 테스트 종속성을 추가하고 spring.datasource.url = jdbc : p6spy : h2 : mem : testdb 및 spring.datasource.driver-class-를 설정하도록 application.yml을 조정했습니다. name = com.p6spy.engine.spy.P6SpyDriver를 입력 한 다음 realdriver = org.h2.Driver 및 로그 파일을 선호하는 경로로 설정하여 spy.properties를 추가했습니다. 결과 로그 파일에서 전체 SQL을 쉽게 추출 할 수있었습니다. 유일한 문제는 H2가 생성 된 타임 스탬프 형식을 좋아하지 않았다는 것입니다.
Ken Pronovici

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>


이것이 질문과 어떤 관련이 있습니까?
hotzst

2

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

그리고 그것은 매력처럼 작동했습니다.


2

log4j.file에서 아래 속성을 설정하여 나를 위해 일한 것은 다음과 같습니다.

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

동면 속성 설정 :

hibernate.show_sql=true

2

Wildfly (standalone.xml)로 개발하려면 다음 로거를 추가하십시오.

<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 )

이봐 ... 나는이 접근법의 예를 찾을 수 없습니다. 참조 / 예제 / 자습서를 제공해 주시겠습니까? 그리고 그것은 여전히 ​​최신 버전이나 최대 절전 모드 / log4j와 동일하거나 org.hibernate.QueryTranslator 또는 무언가가되었습니다. 감사
dev ray

이봐 ... 나는 이것을 시도했지만 이것은 저장 또는 업데이트와 함께 작동하지 않는 것 같습니다. 나는 단지 SQL에 HQL에서 번역 활동하기 시작하는 선택 쿼리, 작동 추측
dev에 선

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 사용 또는 이와 유사한 것을 .

위에서 언급 한 답변 중 어느 것도 매개 변수가있는 SQL을 올바르게 인쇄하지 않거나 고통스럽지 않습니다. WireShark 을 사용하여이를 달성했습니다 .이 쿼리는 응용 프로그램에서 Oracle / Mysql 등으로 전송되는 모든 SQL / 명령을 쿼리로 캡처합니다.


2
Log4JDBC는 것입니다. 위 참조.
Alan Hay

1

여기에있는 모든 대답이 도움이되지만 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

1

자바에서 :

CriteriaQuery (javax.persistence) 인 경우 TypedQuery에서 쿼리를 변환하십시오.

그때:

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


1
감사합니다. 쿼리를 인쇄하지만 사용한 매개 변수는 인쇄하지 않습니다. 매개 변수도 인쇄 할 수있는 방법이 있습니까?
Liz Lamperouge 2018 년

0

최대 절전 모드는 쿼리와 해당 매개 변수 값을 다른 줄에 표시합니다.

스프링 부트에서 application.properties를 사용하고 있고 application.properties에서 아래 강조 표시된 매개 변수를 사용할 수있는 경우

  1. org.hibernate.SQL은 쿼리를 보여줄 것이다

    logging.level.org.hibernate.SQL = DEBUG

  2. 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] 바인딩 매개 변수 [1]을 [BOOLEAN]-[true]
      • 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] [VARCHAR]-[public]과 같은 바인딩 매개 변수 [3]

1
이조 차도 쿼리의 한계오프셋 값을 표시하지 않습니다 .
T3rm1 2019 년

0

가장 간단한 해결책은 일반 stringReplace를 구현하여 매개 변수 입력을 매개 변수 값으로 바꾸는 것입니다 (간단하게 모든 매개 변수를 문자열로 처리).

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

또는 위치 매개 변수 (?)와 유사한 것.
실행 준비된 SQL을 기록하려면 널값 및 날짜와 같은 특정 값 유형을 관리하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.