복붙노트

[SQL] 최대 절전 모드를 사용하는 경우 어떻게 매개 변수 값을 쿼리 문자열을 인쇄

SQL

최대 절전 모드를 사용하는 경우 어떻게 매개 변수 값을 쿼리 문자열을 인쇄

그것은 Hibernate에서 실제 값 대신 물음표가 생성 된 SQL 쿼리를 인쇄 할 수 있습니까?

최대 절전 모드로 API를 수없는 경우 어떻게 실제 값으로 쿼리를 인쇄하는 것이 좋습니다까요?

해결법

  1. ==============================

    1.당신은 다음과 같은 범주에 대한 로깅을 사용하도록 설정해야합니다 :

    당신은 다음과 같은 범주에 대한 로깅을 사용하도록 설정해야합니다 :

    그래서 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에 해당합니다.

    또 다른 해결책 (기반이 아닌 최대 절전 모드)는 P6Spy로 같은 JDBC 프록시 드라이버를 사용하는 것입니다.

  2. ==============================

    2.그냥 편의를 위해, 여기 Logback (SLF4J)에 대한 동일한 구성의 예입니다

    그냥 편의를 위해, 여기 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
    
  3. ==============================

    3.있는 hibernate.cfg.xml을하는 변경 :

    있는 hibernate.cfg.xml을하는 변경 :

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

    log4j에와 "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
    
  4. ==============================

    4.봄 부팅의 경우 사용중인에서는 바로이 config (설정) :

    봄 부팅의 경우 사용중인에서는 바로이 config (설정) :

    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

  5. ==============================

    5.Log4JDBC 정확한 SQL이 작업을 수행하지 않는 여기에 오히려 가장 인기있는 대답보다 장소에 매개 변수를 사용하여 데이터베이스에가는 인쇄하는 좋은 솔루션입니다. 이 중 하나의 주요 편의 당신이 당신의 DB 프런트 엔드에 바로 SQL을 복사하여 그대로 실행할 수 있다는 것입니다.

    Log4JDBC 정확한 SQL이 작업을 수행하지 않는 여기에 오히려 가장 인기있는 대답보다 장소에 매개 변수를 사용하여 데이터베이스에가는 인쇄하는 좋은 솔루션입니다. 이 중 하나의 주요 편의 당신이 당신의 DB 프런트 엔드에 바로 SQL을 복사하여 그대로 실행할 수 있다는 것입니다.

    http://log4jdbc.sourceforge.net/

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

    후자는 또한 조회 결과를 표 표현을 출력한다.

    쿼리의 결과 집합 테이블 장소 함께에서 PARAMS와 생성 된 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/)를 사용하여왔다. 메이븐 내에 필요한 종속성 셋업 다음과 같습니다 :

    <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 클래스 패스 예를 들어,의 루트에 파일을 생성했다 Mevn 프로젝트의 SRC / 테스트 / 자원이나 SRC / 메인 / 자원. 이 파일은 다음과 같습니다 하나 개의 라인을 가지고 :

    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 |
    |----------|---|---|----------|--------|---|-----|
    |----------|---|---|----------|--------|---|-----|
    
  6. ==============================

    6.당신의 log4j.xml에 범주 라인을 추가 할 수 있습니다 :

    당신의 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. ==============================

    7.당신의 log4j 또는 logback 구성 속성과 값을 다음과 같은 추가 :

    당신의 log4j 또는 logback 구성 속성과 값을 다음과 같은 추가 :

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

    8.나는이 게시물에 설명 된대로 데이터 소스 프록시를 사용 할 수 있습니다.

    나는이 게시물에 설명 된대로 데이터 소스 프록시를 사용 할 수 있습니다.

    데이터 소스 빈 (예를 들어를 통해 @Resource) 응용 프로그램을 기대한다 가정하면,이 얼마나 할 수 있습니다 구성 데이터 소스 프록시 :

    <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]}
    

    데이터 소스 프록시 쿼리 매개 변수 값을 포함하고 바로 통합 테스트에서 N + 1 쿼리 문제를 잡을 수 있도록 당신은 사용자 정의 JDBC 문 인터셉터를 추가 할 수 있습니다.

  9. ==============================

    9.실제 매개 변수가 물음표로 결합하는 방법을 확인하기 위해 org.hibernate.type 로거를 켭니다.

    실제 매개 변수가 물음표로 결합하는 방법을 확인하기 위해 org.hibernate.type 로거를 켭니다.

  10. ==============================

    10.

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

  11. ==============================

    11.이 솔루션은 정확하지만 결과 개체에 대한 모든 바인딩을 기록합니다. 별도의 펜더를 작성하고, 예를 들어, 필터링을 사용하려면이 그것의 possibile을 방지하기 위해 :

    이 솔루션은 정확하지만 결과 개체에 대한 모든 바인딩을 기록합니다. 별도의 펜더를 작성하고, 예를 들어, 필터링을 사용하려면이 그것의 possibile을 방지하기 위해 :

    <!-- 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>
    
  12. ==============================

    12.

    **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
    
  13. ==============================

    13.이 답변은 질문에 대한 약간의 분산이다. 때때로 우리는 런타임 디버그 목적으로 만 SQL을해야합니다. 이 경우, 에디터에 디버그를 사용하여 좀 더 쉬운 방법이 있습니다.

    이 답변은 질문에 대한 약간의 분산이다. 때때로 우리는 런타임 디버그 목적으로 만 SQL을해야합니다. 이 경우, 에디터에 디버그를 사용하여 좀 더 쉬운 방법이 있습니다.

    이것은 내가 확실하지 않다 최대 절전 모드 3.위한 다른 버전에이 일이.

  14. ==============================

    14.당신은 적어도이> = mysql을 - 연결 - 항아리-5.1.6.jar 항아리의 버전이 있어야합니다,이 요구 사항을 충족하기 위해 편리를 제공 이미 JDBC 드라이버를해서 MySQL

    당신은 적어도이> = mysql을 - 연결 - 항아리-5.1.6.jar 항아리의 버전이 있어야합니다,이 요구 사항을 충족하기 위해 편리를 제공 이미 JDBC 드라이버를해서 MySQL

    1 단계 : 구성하여 jdbc.url 로거 및 사용자 지정 로깅을 추가합니다]

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

    기본 로깅 log4j를 경우 지금은 SLF4J 로깅을 사용하고, 당신은 SLF4J-API를 사용 SLF4J 로깅을 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();
        }
    
    }
    
  15. ==============================

    15.나는 log4j에 대한이 같은 :

    나는 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 
    
  16. ==============================

    16.당신이 원하는 또는 내가 몇 시간 전에 싶었지만, P6Spy로 완벽하게 작업을 수행하지만, 정확히 작업 로깅,

    당신이 원하는 또는 내가 몇 시간 전에 싶었지만, P6Spy로 완벽하게 작업을 수행하지만, 정확히 작업 로깅,

    여기에 P6Spy뿐만 아니라 MKYONG 자습서를 구현하는 간단한 튜토리얼입니다.

    나를 위해 그것은 마법처럼 일했다.

    은 "에 p6spy-install.jar을"가져

    에 p6spy.jar 및 spy.properties의에 p6spy-install.jar 파일보기를 추출

    프로젝트 라이브러리 의존성에에 p6spy.jar 추가

    데이터베이스 구성 파일을 수정합니다. 당신은 P6Spy로 JDBC 드라이버를 사용하여 기존의 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>
    

    기존의 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"를 찾을 수 있도록.

  17. ==============================

    17.

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

  18. ==============================

    18.최대 절전 모드 4 SLF4J / log4j2 사용하여, 나는 내 log4j2.xml 구성에 다음을 추가하는 시도 :

    최대 절전 모드 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>
    

    그러나 성공하지.

    I 필요 동면에서 사용되는 보스 로깅 프레임 워크 SLF4J 통해 기록하기 위해 구성되는 것을 스레드을 알았다. 나는 응용 프로그램의 VM 인수에 다음 인수를 추가 :

    -Dorg.jboss.logging.provider=slf4j
    

    그리고 그것이 마치 마법처럼 일했다.

  19. ==============================

    19.여기에 log4j.file 재산 이하, 나를 위해 세트를 일 것입니다 :

    여기에 log4j.file 재산 이하, 나를 위해 세트를 일 것입니다 :

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

    속성 설정을 최대 절전 모드 :

    hibernate.show_sql=true
    
  20. ==============================

    20.제이보스 (standalone.xml)를 개발, 그 로거를 추가 :

    제이보스 (standalone.xml)를 개발, 그 로거를 추가 :

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

    21.당신은 최대 절전 모드 3.2.xx를 사용하는 경우 사용하다

    당신은 최대 절전 모드 3.2.xx를 사용하는 경우 사용하다

    log4j.logger.org.hibernate.SQL=trace
    

    대신에

    log4j.logger.org.hibernate.SQL=debug 
    
  22. ==============================

    22.당신이 로그인 할 수 있습니다 :

    당신이 로그인 할 수 있습니다 :

    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 )
    
  23. ==============================

    23.Log4Jdbc 플러그인은 귀하의 요구에 최선을 다 할 것이다. 그것은 다음과 같은 -을 보여줍니다

    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/
    
  24. ==============================

    24.사용 와이어 샤크 또는 이와 유사한 :

    사용 와이어 샤크 또는 이와 유사한 :

    위에서 언급 한 답변 중 어느 것도 제대로 매개 변수를 사용하여 SQL을 인쇄하지 않습니다 또는 고통이다. 나는 쿼리와 오라클 응용 프로그램에서 모든 SQL / 명령 인 전송을 / mysql을 등 캡처 WireShark로를 사용하여이 작업을 달성했다.

  25. ==============================

    25.여기에 답변 모두 도움이됩니다,하지만 당신은의 log4j SQL 수준 변수를 설정, 설정에 세션 공장 Spring 애플리케이션 컨텍스트 XML을 사용하는 경우에만 당신은 또한으로 hibernate.show_sql 변수를 설정해야이 당신에게하는 방식의 부분을 가져옵니다 응용 프로그램 컨텍스트 자체의 값을 보여주는 실제로 시작하는 최대 절전 모드를 얻을 수 있습니다.

    여기에 답변 모두 도움이됩니다,하지만 당신은의 log4j SQL 수준 변수를 설정, 설정에 세션 공장 Spring 애플리케이션 컨텍스트 XML을 사용하는 경우에만 당신은 또한으로 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
    
  26. ==============================

    26.자바에서 :

    자바에서 :

    그것은 CriteriaQuery (는 javax.persistence가)의 경우 TypedQuery에 쿼리를 변환.

    그때:

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

  27. ==============================

    27.쇼 쿼리 및 다른 라인에서의 매개 변수 값을 최대 절전 모드.

    쇼 쿼리 및 다른 라인에서의 매개 변수 값을 최대 절전 모드.

    당신이 봄 부팅에 application.properties를 사용하는 경우는 application.properties으로 강조 매개 변수 아래에 사용할 수 있습니다.

  28. ==============================

    28.나를 위해 가장 간단한 해결 방법은 매개 변수 값 (편의상, 문자열로 모든 매개 변수를 치료)와 매개 변수 입력을 대체하기 위해 정기적 StringReplace와 구현한다 :

    나를 위해 가장 간단한 해결 방법은 매개 변수 값 (편의상, 문자열로 모든 매개 변수를 치료)와 매개 변수 입력을 대체하기 위해 정기적 StringReplace와 구현한다 :

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

    또는 위치 매개 변수에 대한 비슷한 (?). 당신이 실행 준비 SQL을 기록 할 경우, 날짜처럼 널 (null) 값과 특정 값 유형의주의하십시오.

  29. ==============================

    29.당신은 봄 부팅 및 JPA를 사용하는 경우

    당신은 봄 부팅 및 JPA를 사용하는 경우

    spring.jpa.properties.hibernate.show_sql=false
    

    숨기기 로그에 최대 절전 모드를 알려줍니다

    사실은 기본적 것 같다!

  30. from https://stackoverflow.com/questions/1710476/how-to-print-a-query-string-with-parameter-values-when-using-hibernate by cc-by-sa and MIT license