Ini bermanfaat. Tapi ini tidak menunjukkan pertanyaan SQL yang sebenarnya.
Nicolas Barbulesco
6
@ Nicolas itu benar, namun segera setelah permintaan itu membayar parameter yang diikat.
Xtreme Biker
2
Saya menggunakan grails 2.4.4 dan hibernate 4. Mengubah konfigurasi log4j tidak bekerja untuk saya tetapi p6spy bekerja!
Champ
11
Di Hibernate 5 kita bisa menggunakan org.hibernate.type.descriptor.sql.BasicBinderlogger. Mengaktifkan pencatatan pada org.hibernate.typeinfo terlalu banyak yang tidak berguna bagi saya ...
csharpfolk
5
org.hibernate.typedan org.hibernate.loader.hqltidak bekerja bagi saya untuk menunjukkan parameter
Dherik
75
Hanya untuk kenyamanan, berikut adalah contoh konfigurasi yang sama untuk Logback (SLF4J)
Terima kasih, telah bekerja dengan baik untuk saya. Pengaturan itu akan menambahkan di bawah sql query parameter seperti binding parameter [1] as [VARCHAR] - [1].
Log4JDBC adalah solusi bagus yang mencetak SQL yang tepat pergi ke database dengan parameter di tempat daripada jawaban paling populer di sini yang tidak melakukan ini. Satu kemudahan utama dari ini adalah Anda dapat menyalin SQL langsung ke front-end DB Anda dan mengeksekusi apa adanya.
Yang terakhir juga menampilkan representasi tabular dari hasil kueri.
Contoh Output menunjukkan SQL yang dihasilkan dengan params di tempat bersama dengan tabel set hasil dari kueri:
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)10Oct201316:21:224953[main] INFO jdbc.resultsettable -|---|--------|--------|-----------|----------|---------|-------|10Oct201316:21:224953[main] INFO jdbc.resultsettable -|ID |CREATED |DELETED |CODESET_ID |NAME |POSITION |PREFIX |10Oct201316:21:224953[main] INFO jdbc.resultsettable -|---|--------|--------|-----------|----------|---------|-------|10Oct201316:21:224953[main] INFO jdbc.resultsettable -|2|null|null|1|Country2|1|60|10Oct201316:21:224953[main] INFO jdbc.resultsettable -|---|--------|--------|-----------|----------|---------|-------|
Perbarui 2016
Baru-baru ini saya sekarang menggunakan log4jdbc-log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ ) dengan SLF4j dan logback. Ketergantungan maven yang diperlukan untuk pengaturan saya adalah sebagai berikut:
File konfigurasi logback.xml saya terlihat seperti di bawah ini: ini menampilkan semua pernyataan SQL dengan parameter plus tabel resultset untuk semua permintaan.
<?xml version="1.0" encoding="UTF-8"?><configuration><appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern></encoder></appender><loggername="jdbc.audit"level="ERROR"/><loggername="jdbc.connection"level="ERROR"/><loggername="jdbc.sqltiming"level="ERROR"/><loggername="jdbc.resultset"level="ERROR"/><!-- UNCOMMENT THE BELOW TO HIDE THE RESULT SET TABLE OUTPUT --><!--<logger name="jdbc.resultsettable" level="ERROR" /> --><rootlevel="debug"><appender-refref="STDOUT"/></root></configuration>
Akhirnya, saya harus membuat file bernama log4jdbc.log4j2.properties di root classpath misalnya src / test / resources atau src / main / resources dalam proyek Mevn. File ini memiliki satu baris yaitu di bawah ini:
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=10410:44:29.402[main] INFO jdbc.resultsettable -|----------|---|---|----------|--------|---|-----||member_id |id |id |member_id |role_id |id |name ||----------|---|---|----------|--------|---|-----||----------|---|---|----------|--------|---|-----|
Hei .... Ini sepertinya keren .... hanya apa yang diperintahkan dokter untukku :) ... tetapi apakah itu juga mendukung CLOB / BLOB ?? Juga, apakah mungkin untuk hanya menampilkan kueri dan bukan hasil yang ditetapkan. - Terima kasih :)
dev ray
1
dapatkah Anda memberi saya contoh konfigurasi bagaimana melakukan itu?
grep
Sebenarnya, yang terakhir menampilkan representasi tabluar dari hasil permintaan ... yaitu kita perlu log4jdbc-remix untuk fitur yang bagus itu.
meriton
Solusi ini terbaik untuk situasi saya di mana saya perlu melihat nilai-nilai nomor baris yang dihasilkan Hibernate untuk kumpulan hasil paging. Pencatatan jejak hanya menunjukkan nilai parameter kueri.
Oliver Hernandez
@ Alan Hay, apakah ini mencatat pertanyaan asli juga?
Sayantan
9
Anda dapat menambahkan baris kategori ke log4j.xml:
The org.hibernate.type.descriptor.sql.BasicBinderkategori tidak mencakup semua parameter, misalnya jenis enum. Jadi, jika Anda menginginkan semuanya, Anda benar-benar perlu TRACEuntuk seluruh org.hibernate.typekelompok.
seanf
Bagi saya ini berfungsi di Hibernate 4.3! Plus, saya tidak akan MELAKUKAN org.hibernate.type penuh, karena itu terlalu banyak output. Dalam kebanyakan kasus, solusi ini akan berhasil.
cslotty
Perhatikan bahwa org.hibernate.type.descriptor.sql.BasicExtractor mencatat set hasil. Jadi memiliki entri ukuran besar bahkan dapat menghentikan aplikasi saat masuk ke konsol di Eclipse, dan saya kira itu juga tidak ideal untuk masuk ke file. Itu sebabnya saya lebih suka solusi ini, ini juga berfungsi di Hibernate 3. Bagi mereka yang tertarik pada tipe enum, silakan coba kelas yang tepat yang mencatatnya ketika org.hibernate.type = TRACE. Kemudian atur org.hibernate.type.xyz.TheClassThatLogsEnumParams = TRACE.
Solusinya benar tetapi mencatat juga semua binding untuk objek hasil. Untuk mencegahnya, mungkin membuat append terpisah dan mengaktifkan penyaringan, misalnya:
<!-- A time/date based rolling appender --><appendername="FILE_HIBERNATE"class="org.jboss.logging.appender.DailyRollingFileAppender"><errorHandlerclass="org.jboss.logging.util.OnlyOnceErrorHandler"/><paramname="File"value="${jboss.server.log.dir}/hiber.log"/><paramname="Append"value="false"/><paramname="Threshold"value="TRACE"/><!-- Rollover at midnight each day --><paramname="DatePattern"value="'.'yyyy-MM-dd"/><layoutclass="org.apache.log4j.PatternLayout"><!-- The default pattern: Date Priority [Category] Message\n --><paramname="ConversionPattern"value="%d %-5p [%c] %m%n"/></layout><filterclass="org.apache.log4j.varia.StringMatchFilter"><paramname="StringToMatch"value="bind"/><paramname="AcceptOnMatch"value="true"/></filter><filterclass="org.apache.log4j.varia.StringMatchFilter"><paramname="StringToMatch"value="select"/><paramname="AcceptOnMatch"value="true"/></filter><filterclass="org.apache.log4j.varia.DenyAllFilter"/></appender><categoryname="org.hibernate.type"><priorityvalue="TRACE"/></category><loggername="org.hibernate.type"><levelvalue="TRACE"/><appender-refref="FILE_HIBERNATE"/></logger><loggername="org.hibernate.SQL"><levelvalue="TRACE"/><appender-refref="FILE_HIBERNATE"/></logger>
**If you want hibernate to print generated sql queries with real values instead of question marks.****add following entry in hibernate.cfg.xml/hibernate.properties:**
show_sql=true
format_sql=true
use_sql_comments=true**Andadd 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
Hai single31 baris di atas harus ditambahkan dalam file konfigurasi hibernate Anda maka pasti akan berfungsi. Saya selalu memposting hal yang telah saya lakukan secara praktis.
Vijay Bhatt
3
Jawaban ini sedikit berbeda untuk pertanyaan itu. Terkadang, kita hanya perlu sql hanya untuk keperluan debug di runtime. Dalam hal ini, ada cara yang lebih mudah, menggunakan debug pada editor.
Letakkan breakpoint di org.hibernate.loader.Loader.loadEntityBatch (atau navigasikan di tumpukan sampai di sana);
Ketika eksekusi ditangguhkan, lihat nilai variabel this.sql;
Ini untuk hibernasi 3. Saya tidak yakin ini berfungsi pada versi lain.
sekarang, ia menggunakan logging slf4j, jika logging default Anda adalah log4j, Anda harus menambahkan slf4j-api, dependensi slf4j-log4j12 untuk menggunakan logging slf4j
langkah 2: [tulis log kustom Anda]
package com.xxx;import java.sql.SQLException;import java.util.Properties;import com.mysql.jdbc.Connection;import com.mysql.jdbc.log.Log;publicclassCustomLoggingProfilerEventHandlerimplementsProfilerEventHandler{privateLog log;publicLoggingProfilerEventHandler(){}publicvoid 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);}publicvoid destroy(){this.log =null;}publicvoid init(Connection conn,Properties props)throwsSQLException{this.log = conn.getLog();}}
Hei - ini bagus. Tapi saya pikir di sini pertanyaan dicetak dengan? diikuti dengan nilai parameter. Karena saya punya banyak sekali pertanyaan, saya butuh sesuatu yang bisa saya salin-tempel pada editor sql dan itu akan dieksekusi. Apakah ada cara saya bisa melakukan itu dengan menggunakan pendekatan ini. Saya tidak begitu tertarik untuk pergi ke perpustakaan pihak ke-3. Terima kasih :)
dev ray
Terima kasih. Saya berharap tidak harus menggunakan solusi pihak ke-3 dan hibernasi secara langsung, tapi saya rasa saya tidak punya pilihan lain.
dev ray
2
Logging berfungsi tetapi tidak persis seperti yang Anda inginkan atau saya inginkan beberapa waktu lalu, tetapi P6Spy berfungsi dengan baik ,
Ganti real driverdengan driver MySQL JDBC yang ada
realdriver=com.mysql.jdbc.Driver#specifies another driver to use
realdriver2=#specifies a third driver to use
realdriver3=
Ubah lokasi file Log. Ubah lokasi file log di properti logfile, semua pernyataan SQL akan masuk ke file ini.
Windows
logfile = c:/spy.log
* nix
logfile =/srv/log/spy.log
Salin “spy.properties”ke classpath proyek
Salin “spy.properties”ke folder root proyek Anda, pastikan proyek Anda dapat menemukan "spy.properties", jika tidak maka akan meminta “spy.properties”file tidak ditemukan pengecualian.
Ini adalah jalur termudah bagi saya dalam aplikasi Boot Spring saya, di mana saya mencoba untuk log SQL yang dihasilkan dari tes unit. Saya menambahkan dependensi tes ke Gradle (testCompile 'p6spy: p6spy: 3.8.5'), app.yml yang disesuaikan untuk mengatur spring.datasource.url = jdbc: p6spy: h2: mem: testdb dan spring.datasource.driver-class- name = com.p6spy.engine.spy.P6SpyDriver, dan kemudian menambahkan properti spy.prop dengan realdriver = org.h2.Driver dan logfile diatur ke jalur yang saya pilih. Mudah untuk mengekstrak SQL lengkap dari file log yang dihasilkan. Satu-satunya masalah adalah H2 tidak suka format cap waktu yang dibuat.
Saya menemukan melalui utas ini bahwa kerangka jboss-logging yang digunakan oleh hibernate perlu dikonfigurasikan untuk dapat login melalui slf4j. Saya menambahkan argumen berikut ke argumen VM aplikasi:
2013-10-3114: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=985and noti.tipo=34462013-10-3114: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)
Hei ... Saya tidak dapat menemukan contoh pendekatan ini. Bisakah Anda memberikan referensi / contoh / tutorial. Dan apakah masih sama dengan versi terbaru atau hibernate / log4j atau telah menjadi beberapa org.hibernate.QueryTranslator atau sesuatu. Terima kasih
dev ray
Hai ... Saya sudah mencoba ini, tetapi ini sepertinya tidak berfungsi dengan menyimpan atau memperbarui. Saya kira itu hanya berfungsi untuk kueri pemilihan, di mana terjemahan dari hql ke sql mulai dimainkan
dev ray
1
Plugin Log4Jdbc akan menjadi yang terbaik untuk kebutuhan Anda. Ini menunjukkan berikut-
1.Complete SQL query being hit to the db
2.Parameter values being passed to the query
3.Execution time taken by each query
Lihat tautan di bawah ini untuk mengonfigurasi Log4Jdbc-
Tak satu pun dari jawaban yang disebutkan di atas akan mencetak sql dengan parameter dengan benar atau merepotkan. Saya mencapai ini dengan menggunakan WireShark , yang menangkap semua sql / perintah yang dikirim dari aplikasi ke Oracle / Mysql dll dengan permintaan.
Semua jawaban di sini sangat membantu, tetapi jika Anda menggunakan konteks aplikasi Spring XML untuk mengatur pabrik sesi Anda, mengatur variabel level log4j SQL hanya membuat Anda menjadi bagian dari perjalanan ke sana, Anda juga harus mengatur variabel hibernate.show_sql dalam konteks aplikasi itu sendiri untuk mendapatkan Hibernate untuk mulai benar-benar menunjukkan nilai-nilai.
ApplicationContext.xml memiliki:
<propertyname="hibernateProperties"><value>
hibernate.jdbc.batch_size=25
... <!-- Other parameter values here -->
hibernate.show_sql=true
</value></property>
Terima kasih, Ini mencetak kueri, tetapi bukan parameter yang digunakan, ada cara untuk mencetak parameter juga?
Liz Lamperouge
0
Hibernate menampilkan kueri dan nilai parameternya di baris yang berbeda.
Jika Anda menggunakan application.properties di spring boot dan Anda dapat menggunakan parameter yang disorot di bawah ini di application.properties.
org.hibernate.SQL akan menampilkan kueri
logging.level.org.hibernate.SQL = DEBUG
org.hibernate.type akan menampilkan semua nilai parameter, yang akan dipetakan dengan pilih, masukkan dan perbarui kueri. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType akan menampilkan nilai parameter tipe enum
logging.level.org.hibernate.type.EnumType = TRACE
contoh ::
2018-06-1411:06:28,217 TRACE [main][EnumType.java :321]Binding[active] to parameter:[1]
sql.BasicBinder akan menampilkan nilai parameter tipe integer, varchar, tipe boolean
Bahkan ini tidak menunjukkan nilai untuk batas dan offset dalam kueri.
T3rm1
0
Solusi paling sederhana bagi saya adalah menerapkan stringReplace biasa untuk mengganti input parameter dengan nilai parameter (memperlakukan semua parameter sebagai string, untuk kesederhanaan):
String debugedSql = sql;//then, for each named parameter
debugedSql = debugedSql.replaceAll(":"+key,"'"+value.toString()+"'");//and finnaly
println(debugedSql);
atau sesuatu yang serupa untuk parameter posisi (?).
Jaga nilai null dan tipe nilai spesifik seperti tanggal, jika Anda ingin menjalankan sql yang siap untuk dicatat.
Jawaban:
Anda harus mengaktifkan pencatatan untuk kategori berikut:
org.hibernate.SQL
- atur untukdebug
mencatat semua pernyataan SQL DML saat dieksekusiorg.hibernate.type
- atur untuktrace
mencatat semua parameter JDBCJadi konfigurasi log4j dapat terlihat seperti:
Yang pertama setara dengan properti
hibernate.show_sql=true
lawas , yang kedua mencetak parameter yang terikat di antara hal-hal lain.Solusi lain (berbasis non hibernasi) adalah menggunakan driver proxy JDBC seperti P6Spy .
sumber
org.hibernate.type.descriptor.sql.BasicBinder
logger. Mengaktifkan pencatatan padaorg.hibernate.type
info terlalu banyak yang tidak berguna bagi saya ...org.hibernate.type
danorg.hibernate.loader.hql
tidak bekerja bagi saya untuk menunjukkan parameterHanya untuk kenyamanan, berikut adalah contoh konfigurasi yang sama untuk Logback (SLF4J)
Output di sql.log Anda (contoh) kemudian terlihat seperti ini:
sumber
Ubah
hibernate.cfg.xml
ke:Sertakan log4j dan entri di bawah ini di "log4j.properties":
sumber
binding parameter [1] as [VARCHAR] - [1]
.Jika spring boot digunakan, konfigurasikan ini:
aplication.yml
aplication.properties
dan tidak ada lagi.
HTH
sumber
Log4JDBC adalah solusi bagus yang mencetak SQL yang tepat pergi ke database dengan parameter di tempat daripada jawaban paling populer di sini yang tidak melakukan ini. Satu kemudahan utama dari ini adalah Anda dapat menyalin SQL langsung ke front-end DB Anda dan mengeksekusi apa adanya.
http://log4jdbc.sourceforge.net/
https://code.google.com/p/log4jdbc-remix/
Yang terakhir juga menampilkan representasi tabular dari hasil kueri.
Contoh Output menunjukkan SQL yang dihasilkan dengan params di tempat bersama dengan tabel set hasil dari kueri:
Perbarui 2016
Baru-baru ini saya sekarang menggunakan log4jdbc-log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ ) dengan SLF4j dan logback. Ketergantungan maven yang diperlukan untuk pengaturan saya adalah sebagai berikut:
Url Driver dan DB kemudian terlihat seperti:
File konfigurasi logback.xml saya terlihat seperti di bawah ini: ini menampilkan semua pernyataan SQL dengan parameter plus tabel resultset untuk semua permintaan.
Akhirnya, saya harus membuat file bernama log4jdbc.log4j2.properties di root classpath misalnya src / test / resources atau src / main / resources dalam proyek Mevn. File ini memiliki satu baris yaitu di bawah ini:
Di atas akan tergantung pada perpustakaan logging Anda. Lihat dokumen di https://code.google.com/archive/p/log4jdbc-log4j2 untuk info lebih lanjut
Output sampel:
sumber
Anda dapat menambahkan baris kategori ke log4j.xml:
dan tambahkan properti hibernasi:
sumber
tambahkan properti dan nilai berikut ke konfigurasi log4j atau logback Anda:
sumber
org.hibernate.type.descriptor.sql.BasicBinder
kategori tidak mencakup semua parameter, misalnya jenis enum. Jadi, jika Anda menginginkan semuanya, Anda benar-benar perluTRACE
untuk seluruhorg.hibernate.type
kelompok.Anda dapat melakukannya dengan menggunakan sumber data-proxy , seperti yang saya jelaskan di posting ini .
Dengan asumsi aplikasi Anda mengharapkan
dataSource
kacang (mis. Via@Resource
), ini adalah bagaimana Anda dapat mengonfigurasidatasource-proxy
:Sekarang output Hibernate vs dataource-proxy:
The
datasource-proxy
query mengandung nilai-nilai parameter dan Anda bahkan dapat menambahkan pencegat kustom pernyataan JDBC sehingga Anda dapat menangkap N + 1 masalah permintaan langsung dari tes integrasi Anda .sumber
nyalakan
org.hibernate.type
Logger untuk melihat bagaimana parameter aktual mengikat tanda tanya.sumber
sumber
Solusinya benar tetapi mencatat juga semua binding untuk objek hasil. Untuk mencegahnya, mungkin membuat append terpisah dan mengaktifkan penyaringan, misalnya:
sumber
sumber
Jawaban ini sedikit berbeda untuk pertanyaan itu. Terkadang, kita hanya perlu sql hanya untuk keperluan debug di runtime. Dalam hal ini, ada cara yang lebih mudah, menggunakan debug pada editor.
Ini untuk hibernasi 3. Saya tidak yakin ini berfungsi pada versi lain.
sumber
mysql jdbc driver telah memberikan kenyamanan untuk memenuhi persyaratan ini, Anda setidaknya harus memiliki versi jar> = mysql-connect-jar-5.1.6.jar
langkah 1: [konfigurasikan jdbc.url Anda untuk menambahkan logger dan custom logging]
sekarang, ia menggunakan logging slf4j, jika logging default Anda adalah log4j, Anda harus menambahkan slf4j-api, dependensi slf4j-log4j12 untuk menggunakan logging slf4j
langkah 2: [tulis log kustom Anda]
sumber
Saya suka ini untuk log4j:
sumber
Logging berfungsi tetapi tidak persis seperti yang Anda inginkan atau saya inginkan beberapa waktu lalu, tetapi P6Spy berfungsi dengan baik ,
di sini adalah tutorial sederhana untuk menerapkan juga tutorial MKYONG untuk P6Spy .
bagi saya itu bekerja seperti pesona.
Dapatkan "p6spy-install.jar"
Ekstrak
p6spy-install.jar
file, carip6spy.jar
danspy.properties
Tambahkan
p6spy.jar
ke dalam ketergantungan pustaka proyek AndaUbah file konfigurasi basis data Anda. Anda perlu mengganti driver JDBC yang ada dengan driver P6Spy JDBC -
com.p6spy.engine.spy.P6SpyDriver
Asli adalah driver MySQL JDBC -
com.mysql.jdbc.Driver
Mengubahnya menjadi driver P6Spy JDBC -
com.p6spy.engine.spy.P6SpyDriver
spy.properties
Ganti
real driver
dengan driver MySQL JDBC yang adaUbah lokasi file Log. Ubah lokasi file log di properti logfile, semua pernyataan SQL akan masuk ke file ini.
Windows
* nix
“spy.properties”
ke classpath proyekSalin
“spy.properties”
ke folder root proyek Anda, pastikan proyek Anda dapat menemukan "spy.properties", jika tidak maka akan meminta“spy.properties”
file tidak ditemukan pengecualian.sumber
sumber
Menggunakan Hibernate 4 dan slf4j / log4j2, saya mencoba menambahkan yang berikut ini di konfigurasi log4j2.xml saya:
Tetapi tanpa hasil.
Saya menemukan melalui utas ini bahwa kerangka jboss-logging yang digunakan oleh hibernate perlu dikonfigurasikan untuk dapat login melalui slf4j. Saya menambahkan argumen berikut ke argumen VM aplikasi:
Dan itu bekerja seperti pesona.
sumber
Inilah yang bekerja untuk saya, set properti di bawah ini di log4j.file:
Pengaturan properti hibernasi:
sumber
untuk pengembangan dengan Wildfly (standalone.xml), tambahkan penebang tersebut:
sumber
jika Anda menggunakan hibernate 3.2.xx gunakan
dari pada
sumber
Anda dapat mencatat ini:
Contoh keluaran:
sumber
Plugin Log4Jdbc akan menjadi yang terbaik untuk kebutuhan Anda. Ini menunjukkan berikut-
Lihat tautan di bawah ini untuk mengonfigurasi Log4Jdbc-
sumber
Gunakan Wireshark atau yang serupa:
Tak satu pun dari jawaban yang disebutkan di atas akan mencetak sql dengan parameter dengan benar atau merepotkan. Saya mencapai ini dengan menggunakan WireShark , yang menangkap semua sql / perintah yang dikirim dari aplikasi ke Oracle / Mysql dll dengan permintaan.
sumber
Semua jawaban di sini sangat membantu, tetapi jika Anda menggunakan konteks aplikasi Spring XML untuk mengatur pabrik sesi Anda, mengatur variabel level log4j SQL hanya membuat Anda menjadi bagian dari perjalanan ke sana, Anda juga harus mengatur variabel hibernate.show_sql dalam konteks aplikasi itu sendiri untuk mendapatkan Hibernate untuk mulai benar-benar menunjukkan nilai-nilai.
ApplicationContext.xml memiliki:
Dan file log4j Anda perlu
sumber
Di Jawa:
Ubah kueri Anda di TypedQuery jika itu adalah KriteriaQuery (javax.persistence).
Kemudian:
query.unwrap (org.hibernate.Query.class) .getQueryString ();
sumber
Hibernate menampilkan kueri dan nilai parameternya di baris yang berbeda.
Jika Anda menggunakan application.properties di spring boot dan Anda dapat menggunakan parameter yang disorot di bawah ini di application.properties.
org.hibernate.SQL akan menampilkan kueri
logging.level.org.hibernate.SQL = DEBUG
org.hibernate.type akan menampilkan semua nilai parameter, yang akan dipetakan dengan pilih, masukkan dan perbarui kueri. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType akan menampilkan nilai parameter tipe enum
logging.level.org.hibernate.type.EnumType = TRACE
contoh ::
sql.BasicBinder akan menampilkan nilai parameter tipe integer, varchar, tipe boolean
logging.level.org.hibernate.type.descriptor.sql.BasicBinder = TRACE
contoh ::
sumber
Solusi paling sederhana bagi saya adalah menerapkan stringReplace biasa untuk mengganti input parameter dengan nilai parameter (memperlakukan semua parameter sebagai string, untuk kesederhanaan):
atau sesuatu yang serupa untuk parameter posisi (?).
Jaga nilai null dan tipe nilai spesifik seperti tanggal, jika Anda ingin menjalankan sql yang siap untuk dicatat.
sumber