Hazırda Bekletme kullanılırken parametre değerleri olan bir sorgu dizesi nasıl yazdırılır


Yanıtlar:


426

Aşağıdaki kategoriler için günlüğe kaydetmeyi etkinleştirmeniz gerekir :

  • org.hibernate.SQL   - debugyürütülürken tüm SQL DML deyimlerini günlüğe kaydetmek için
  • org.hibernate.type- tracetüm JDBC parametrelerini günlüğe kaydetmek için

Yani bir log4j yapılandırması şöyle görünebilir:

# logs the SQL statements
log4j.logger.org.hibernate.SQL=debug 

# Logs the JDBC parameters passed to a query
log4j.logger.org.hibernate.type=trace 

Birincisi hibernate.show_sql=trueeski özelliğe eşdeğerdir , ikincisi bağlı parametreleri diğer şeylere yazdırır.

Başka bir çözüm (hazırda bekleme tabanlı olmayan), P6Spy gibi bir JDBC proxy sürücüsü kullanmak olacaktır .


11
Bu kullanışlı. Ama bu bana gerçek SQL sorgularını göstermiyor.
Nicolas Barbulesco

6
@Nicolas doğru, ancak sorgudan sonra bağlı parametreleri dağıtır.
Xtreme Biker

2
Ben 2.4.4 grails ve hazırda bekleme 4 kullanıyorum. Log4j yapılandırmasını değiştirmek benim için işe yaramadı ama p6spy çalıştı!
Champ

11
Hibernate 5'te org.hibernate.type.descriptor.sql.BasicBindergünlükçüyü kullanabiliriz . Oturum açmayı etkinleştirmek org.hibernate.typebenim için çok işe yaramaz bilgiler yazdırdı ...
csharpfolk

5
org.hibernate.typeve org.hibernate.loader.hqlparametreleri göstermek için benim için çalışmıyor
Dherik

75

Yalnızca kolaylık olması açısından, Logback (SLF4J) için aynı yapılandırma örneği aşağıdadır

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

Sonra sql.log (örnek) çıktısı şöyle görünür:

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
Bu OP sorusunu cevaplamıyor.
ShadowGames

33

Şununla hibernate.cfg.xmldeğiştir:

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

"Log4j.properties" dosyasına log4j ve aşağıdaki girişleri ekleyin:

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

Teşekkürler, benim için gerçekten iyi çalıştı. Bu ayarlar sql sorgusunun altına bir parametre ekler binding parameter [1] as [VARCHAR] - [1].
G. Ciardini

28

Yaylı önyükleme kullanılıyorsa, bunu yapılandırın:

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

ve daha fazlası değil.

HTH


20

Log4JDBC, veritabanına giden tam SQL'i, burada bunu yapmayan en popüler cevap yerine yerine parametrelerle basan güzel bir çözümdür . Bunun en büyük kolaylıklarından biri, SQL'i doğrudan DB ön ucunuza kopyalayabilmeniz ve olduğu gibi çalıştırabilmenizdir.

http://log4jdbc.sourceforge.net/

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

İkincisi ayrıca sorgu sonuçlarının tablo şeklinde bir sunumunu verir.

Sorgudaki sonuç kümesi tablosu ile birlikte parametreler ile oluşturulan SQL'i gösteren örnek çıktı:

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

Güncelleme 2016

En son SLF4j ve logback ile log4jdbc -log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ ) kullanıyorum. Kurulumum için gerekli maven bağımlılıkları aşağıdaki gibidir:

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

Sürücü ve DB URL'leri şöyle görünür:

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 yapılandırma dosyam aşağıdaki gibi görünüyor: Bu, tüm SQL ifadelerini parametrelerle birlikte artı tüm sorgular için sonuç kümesi tablolarını çıkarır.

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

Son olarak, sınıfyolunun kökünde log4jdbc.log4j2.properties adlı bir dosya oluşturmak zorunda kaldım, örneğin bir Mevn projesinde src / test / resources veya src / main / resources. Bu dosya aşağıdaki gibi bir satıra sahiptir:

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

Yukarıdakiler günlük kitaplığınıza bağlı olacaktır. Daha fazla bilgi için https://code.google.com/archive/p/log4jdbc-log4j2 adresindeki dokümanlara bakın.

Örnek Çıktı:

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
Hey .... Bu harika görünüyor .... sadece doktor benim için ne sipariş :) ... ama aynı zamanda CLOB / BLOB destekliyor mu ?? Ayrıca, sonuç kümesini değil, yalnızca sorguyu görüntülemek mümkündür. - Teşekkürler :)
dev ray

1
nasıl yapılacağına dair bir örnek verebilir misiniz?
grep

Aslında, ikincisi sorgu sonuçlarının tabluar temsilini çıktılar ... yani bu güzel özellik için log4jdbc-remix gereklidir.
Meriton

Bu çözüm, Hibernate'in disk belleği sonuç kümeleri için oluşturduğu satır numarası değerlerini görmem gereken durumum için en iyisiydi. İzleme günlüğü yalnızca sorgu parametresi değerlerini gösterir.
Oliver Hernandez

@Alan Hay bu yerel sorguları da günlüğe kaydediyor mu?
Sayantan

9

Log4j.xml dosyasına kategori satırları ekleyebilirsiniz:

<category name="org.hibernate.type">
    <priority value="TRACE"/>
</category>

ve hazırda bekletme özelliklerini ekleyin:

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

7

log4j veya logback yapılandırmanıza aşağıdaki özellikleri ve değerleri ekleyin:

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

5
org.hibernate.type.descriptor.sql.BasicBinderKategori tüm parametreleri, örneğin enum türleri içermez. Eğer her şeyi istiyorsanız, gerçekten TRACEtüm org.hibernate.typegruba ihtiyacınız var .
seanf

Benim için Hibernate 4.3'te çalışıyor! Artı, tam org.hibernate.type TRACE olmaz, çünkü bu çok fazla çıktı. Çoğu durumda, bu çözüm işe yarayacaktır.
cslotty

Org.hibernate.type.descriptor.sql.BasicExtractor sonuç kümelerini günlüğe kaydeder. Bu nedenle, büyük boyutlu girişe sahip olmak Eclipse'de konsola giriş yaparken başvuruyu çökertebilir ve sanırım dosyaya giriş için de ideal değildir. Bu yüzden bu çözümü tercih ediyorum, Hazırda Beklet 3'te de çalışıyor. Enum türleriyle ilgilenenler için lütfen org.hibernate.type = TRACE olduğunda onları günlüğe kaydeden tam sınıfı deneyin. Sonra org.hibernate.type.xyz.TheClassThatLogsEnumParams = TRACE ayarını yapın.
Géza

7

Sen kullanarak bunu yapabilirsiniz veri kaynağı-vekil ben de açıklandığı gibi, bu yazı .

Uygulamanızın bir dataSourcefasulye (ör. Yoluyla @Resource) beklediğini varsayarsak , şu şekilde yapılandırabilirsiniz 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"/>

Şimdi Hibernate çıkışı vs datasource-proxy:

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-proxySorguları parametre değerleri içeren ve böylece bile özel JDBC deyimi önleyicilerin ekleyebilir sağ entegrasyon testlerinden N + 1 sorgu sorunları yakalamak .


5

açmak org.hibernate.typefiili parametreler soru işaretleri bağlamak nasıl görmek için Logger.


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

Çözüm doğrudur, ancak sonuç nesneleri için tüm bağlantıları günlüğe kaydeder. Bunu önlemek için ayrı bir ekleyici oluşturmak ve filtrelemeyi etkinleştirmek mümkündür, örneğin:

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

Hey single31 yukarıdaki satırlar hazırda bekleme yapılandırma dosyasına eklenmelidir, o zaman kesinlikle işe yarayacaktır. Her zaman pratik olarak yaptığım şeyleri gönderiyorum.
Vijay Bhatt

3

Bu cevap soru için biraz sapma. Bazen, sql'a yalnızca çalışma zamanında hata ayıklama amacıyla ihtiyaç duyarız. Bu durumda, editörlerde hata ayıklama kullanmanın daha kolay bir yolu vardır.

  • Org.hibernate.loader.Loader.loadEntityBatch üzerine bir kesme noktası koyun (veya oraya kadar yığın üzerinde gezinin);
  • Yürütme askıya alındığında, this.sql değişkeninin değerine bakın;

Bu hazırda bekletme 3 içindir. Diğer sürümlerde çalıştığından emin değilim.


3

mysql jdbc sürücüsü zaten bu gereksinimi karşılamak için uygun bir sağladı, en azından kavanoz sürümüne sahip olmalısınız> = mysql-connect-jar-5.1.6.jar

1. adım: [jdbc.url dosyanızı günlükçü ve özel günlük kaydı eklemek üzere yapılandırın]

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

şimdi, slf4j günlüğü kullanıyor, varsayılan günlüğünüz log4j ise, slf4j günlüğünü kullanmak için slf4j-api, slf4j-log4j12 bağımlılıkları eklemelisiniz

2. adım: [özel günlüğünüzü yazın]

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 için bunu beğendim:

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 

Hey - bu güzel. Ama burada sorguların? bunu parametre değerleri izledi. Sonsuz sayıda sorguya sahip olduğum için, sql editörüne kopyalayıp yapıştırabileceğim bir şeye ihtiyacım var ve bunlar yürütülecek. Bu yaklaşımı kullanarak bunu yapabilmemin bir yolu var mı? Üçüncü parti kütüphanelere gitmeye hevesli değilim. Thanks :)
dev ray

Teşekkürler. Herhangi bir üçüncü taraf çözümünü kullanmamayı ve doğrudan hazırda bekletmemeyi umuyordum, ama sanırım başka seçeneğim yok.
dev ray

2

İstediğiniz ya da ben bir süre önce istedi ama ama tam eserler açılıyor P6Spy çalışır mükemmel ,

İşte P6Spy için MKYONG öğretici uygulamak için basit bir öğretici .

benim için cazibe gibi çalıştı.

  1. P6Spy kütüphanesini indir

“P6spy-install.jar” dosyasını edinin

  1. Çıkart

p6spy-install.jarDosyayı çıkarın , arayın p6spy.jarvespy.properties

  1. Kütüphane bağımlılığı ekle

p6spy.jarProje kitaplığı bağımlılığınıza ekleyin

  1. P6Spy özellikler dosyasını değiştirme

Veritabanı yapılandırma dosyanızı değiştirin. Mevcut JDBC sürücünüzü P6Spy JDBC sürücüsüyle değiştirmeniz gerekir -com.p6spy.engine.spy.P6SpyDriver

Orijinal MySQL JDBC sürücüsüdür - 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 sürücüsüne değiştirildi - 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 özellikler dosyasını değiştirme P6Spy özellikler dosyasını değiştirme -spy.properties

Değiştir real drivermevcut MySQL JDBC sürücüsü ile

realdriver=com.mysql.jdbc.Driver

#specifies another driver to use
realdriver2=
#specifies a third driver to use
realdriver3=

Günlük dosyası konumunu değiştirme Günlük dosyası özelliğinde günlük dosyası konumunu değiştirin, tüm SQL ifadeleri bu dosyaya oturum açar.

pencereler

logfile     = c:/spy.log

* nix

logfile     = /srv/log/spy.log
  1. “spy.properties”Proje sınıfyoluna kopyala

Kopya “spy.properties”proje kök klasörüne emin proje, aksi takdirde istemi olacak “spy.properties” bulabilir hale “spy.properties”dosya bulunamadı istisna.


Bu, bir birim testinden oluşturulan SQL'i günlüğe kaydetmeye çalıştığım Spring Boot uygulamamda benim için en kolay yoldu. Gradle'a bir test bağımlılığı ekledim (testCompile 'p6spy: p6spy: 3.8.5'), spring.datasource.url = jdbc: p6spy: h2: mem: testdb ve spring.datasource.driver-class- name = com.p6spy.engine.spy.P6SpyDriver, sonra da realdriver = org.h2.Dy ve spy.properties ile tercih ettiğim yolu seçtim. Elde edilen günlük dosyasından SQL'in tamamını ayıklamak kolaydı. Tek hıçkırık, H2'nin oluşturulan zaman damgası biçimini beğenmediğiydi.
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>


Bunun soru ile nasıl bir ilişkisi var?
Mart'ta hotzst

2

Hazırda Bekletme 4 ve slf4j / log4j2 kullanarak, log4j2.xml yapılandırmamda aşağıdakileri eklemeyi denedim:

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

Ama başarılı olamadı.

İçinden öğrendim bu konuya gerekli hazırda kullandığı jboss-günlüğü çerçeve slf4j yoluyla giriş yapmak için yapılandırılacak söyledi. Uygulamanın VM bağımsız değişkenlerine aşağıdaki bağımsız değişkeni ekledim:

-Dorg.jboss.logging.provider=slf4j

Ve bir cazibe gibi çalıştı.


2

Benim için işe yarayan, log4j.file dosyasında aşağıda belirtilen özellik:

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

Hazırda bekletme özellikleri ayarları:

hibernate.show_sql=true

2

Wildfly (standalone.xml) ile geliştirme için şu kaydedicileri ekleyin:

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

1

Hazırda bekletme 3.2.xx kullanıyorsanız

log4j.logger.org.hibernate.SQL=trace

onun yerine

log4j.logger.org.hibernate.SQL=debug 

1

Bunu günlüğe kaydedebilirsiniz:

net.sf.hibernate.hql.QueryTranslator

Çıktı örneği:

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 )

Hey ... Bu yaklaşımın herhangi bir örneğini bulamıyorum. Herhangi bir referans / örnek / öğretici verebilir misiniz? Ve hala en son sürümlerle veya hazırda bekletme / log4j ile aynı mı yoksa bazı org.hibernate.QueryTranslator veya başka bir şey haline geldi mi? Teşekkürler
dev ray

Hey ... Bunu denedim, ancak bu kaydetme veya güncelleme ile çalışmıyor gibi görünüyor. Ben sadece hql'den sql'ye çeviri devreye girer seçili sorgular için çalışıyor sanırım
dev ray

1

Log4Jdbc eklentisi gereksiniminiz için en iyi olurdu. Aşağıdaki gösterir-

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- yapılandırmak için aşağıdaki bağlantıya bakın

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

1

Wireshark kullanın veya benzeri bir şey :

Yukarıda belirtilen cevapların hiçbiri sql parametrelerini düzgün bir şekilde yazdırmaz veya bir ağrı değildir. Bunu uygulamadan Oracle / Mysql vb. Sorgulara gönderilen tüm sql / komutlarını yakalayan WireShark kullanarak başardım .


2
Log4JDBC olacaktır. Yukarıyı görmek.
Alan Hay

1

Buradaki tüm yanıtlar yararlıdır, ancak oturum fabrikanızı ayarlamak için bir Spring uygulama bağlamı XML kullanıyorsanız, log4j SQL düzey değişkenini ayarlamak sizi oraya sadece bir parçayla getirir, ayrıca hibernate.show_sql değişkenini de ayarlamanız gerekir Hibernate'in gerçekte değerleri göstermeye başlamasını sağlamak için uygulama bağlamında.

ApplicationContext.xml dosyasında şunlar vardır:

<property name="hibernateProperties">
            <value>
            hibernate.jdbc.batch_size=25
            ... <!-- Other parameter values here -->
            hibernate.show_sql=true
            </value>
 </property>

Ve log4j dosyanızın

log4j.logger.org.hibernate.SQL=DEBUG

1

Java dilinde:

Sorgunuzu bir CriteriaQuery (javax.persistence) ise TypedQuery'de dönüştürün.

Sonra:

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


1
Teşekkürler, Sorguyu yazdırır, ancak kullandığı parametreleri değil, parametreleri de yazdırmanın bir yolu var mı?
Liz Lamperouge

0

Hazırda Beklet, sorguyu ve parametre değerlerini farklı satırlarda gösterir.

Spring boot içinde application.properties kullanıyorsanız ve application.properties içinde aşağıda vurgulanan parametreyi kullanabilirsiniz.

  1. org.hibernate.SQL sorguları gösterecektir

    logging.level.org.hibernate.SQL = DEBUG

  2. org.hibernate.type, seçme, ekleme ve güncelleme sorgularıyla eşlenecek tüm parametre değerlerini gösterir. logging.level.org.hibernate.type = TRACE

    • org.hibernate.type.EnumType enum tipi parametre değerini gösterecektir

      logging.level.org.hibernate.type.EnumType = İZ

      misal ::

      2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
    • sql.BasicBinder tamsayı, varchar, boolean tip parametre değerini gösterecektir

      logging.level.org.hibernate.type.descriptor.sql.BasicBinder = İZ

      misal ::

      • 2018-06-14 11: 28: 29.750 TRACE [http-nio-9891-exec-2] [BasicBinder.java: 65] [BOOLEAN] olarak bağlanma parametresi [1] - [true]
      • 2018-06-14 11: 28: 29.751 TRACE [http-nio-9891-exec-2] [BasicBinder.java: 65] [INTEGER] olarak bağlayıcı parametre [2] - [1]
      • 2018-06-14 11: 28: 29.752 TRACE [http-nio-9891-exec-2] [BasicBinder.java: 65] bağlanma parametresi [3] [VARCHAR] olarak - [herkese açık]

1
Bu bile sorgularda sınır ve ofset değerlerini göstermez .
T3rm1

0

Benim için en basit çözüm, parametre girişlerini parametre değerleriyle değiştirmek için normal bir stringReplace uygulamaktır (basitlik için tüm parametreleri dize olarak ele alıyor):

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

veya konumsal parametreler için benzer bir şey (?).
Çalışmaya hazır bir sql günlüğünün kaydedilmesini istiyorsanız, null değerlere ve tarih gibi belirli değer türlerine dikkat edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.