Hibernate 3.x digunakan slf4juntuk penebangan. Hibernate 4.x menggunakanjboss-logging. Saya menulis aplikasi mandiri yang menggunakan Hibernate 4, dan SLF4J untuk logging.
Bagaimana cara mengkonfigurasi Hibernate untuk masuk ke SLF4J?
Jika itu tidak memungkinkan, bagaimana saya bisa mengkonfigurasi logging Hibernate sama sekali?
Bagian manual Hibernate 4.1 tentang logging dimulai dengan peringatan bahwa ...
Benar-benar ketinggalan zaman. Hibernate menggunakan JBoss Logging mulai 4.0. Ini akan didokumentasikan saat kami memigrasi konten ini ke Panduan Pengembang.
... terus berbicara tentang SLF4J, dan begitu juga tidak berguna. Baik panduan memulai maupun panduan pengembang berbicara tentang logging sama sekali. Begitu pula dengan panduan migrasi .
Saya telah mencari dokumentasi tentang jboss-logging itu sendiri, tetapi saya belum dapat menemukannya sama sekali. The halaman GitHub diam , dan JBoss ini masyarakat memproyeksikan halaman bahkan tidak daftar JBoss-logging. Saya bertanya-tanya apakah pelacak bug proyek ini mungkin memiliki masalah yang berkaitan dengan penyediaan dokumentasi, tetapi ternyata tidak.
Kabar baiknya adalah saat menggunakan Hibernate 4 di dalam server aplikasi, seperti JBoss AS7, logging sebagian besar dilakukan untuk Anda. Tetapi bagaimana saya bisa mengkonfigurasinya dalam aplikasi mandiri?
sumber
Jawaban:
Kunjungi https://github.com/jboss-logging/jboss-logging/blob/master/src/main/java/org/jboss/logging/LoggerProviders.java :
Jadi nilai yang mungkin untuk
org.jboss.logging.provider
adalah:jboss
,jdk
,log4j
,slf4j
.Jika Anda tidak mengatur
org.jboss.logging.provider
, coba jboss, lalu log4j, lalu slf4j (hanya jika logback digunakan) dan fallback ke jdk.Saya gunakan
slf4j
denganlogback-classic
:dan semuanya bekerja dengan baik!
UPDATE Beberapa pengguna kegunaan dalam App.java sangat utama:
tetapi untuk solusi berbasis kontainer, ini tidak berhasil.
UPDATE 2 Mereka yang berpikir bahwa mereka mengelola Log4j dengan SLF4J untuk
jboss-logging
itu sebenarnya tidak demikian.jboss-logging
langsung menggunakan Log4j tanpa SLF4J!sumber
org.jboss.logging.provider
?System.getProperty(LOGGING_PROVIDER_KEY);
Anda perlu mengatur properti sistem. Melaluijava -D...=...
atau periksa dokumen untuk wadah Anda.Untuk membuat SLF4J bekerja dengan JBoss Logging tanpa Logback karena backend membutuhkan penggunaan properti sistem
org.jboss.logging.provider=slf4j
.log4j-over-slf4j
taktik tampaknya tidak berfungsi dalam kasus ini karena logging akan kembali ke JDK jika baik Logback maupun log4j tidak benar-benar ada di classpath.Ini adalah sedikit gangguan dan untuk mendapatkan deteksi otomatis untuk bekerja Anda harus melihat bahwa classloader berisi setidaknya
ch.qos.logback.classic.Logger
dari logback-classic atauorg.apache.log4j.Hierarchy
dari log4j untuk mengelabui JBoss Logging agar tidak kembali ke logging JDK.Sihir ditafsirkan di
org.jboss.logging.LoggerProviders
UPDATE: Dukungan pemuat layanan telah ditambahkan sehingga memungkinkan untuk menghindari masalah dengan deteksi otomatis dengan mendeklarasikan
META-INF/services/org.jboss.logging.LoggerProvider
(denganorg.jboss.logging.Slf4jLoggerProvider
sebagai nilai). Tampaknya ada dukungan tambahan log4j2 juga.sumber
-Dorg.jboss.logging.provider=slf4j
sudah cukup. LoggingProviders.java memberi Anda wawasan yang lebih baik tentang apa saja nilai yang diterima saat ini dan apa yang diharapkan ada di classpath.Slf4jLoggerProvider
bukanpublic
kelas?Terinspirasi oleh pos Hypoport Leif , inilah cara saya "membengkokkan" Hibernate 4 kembali ke slf4j:
Anggap saja Anda menggunakan Maven.
org.slf4j:log4j-over-slf4j
sebagai ketergantungan pada filepom.xml
mvn dependency:tree
, pastikan tidak ada artefak yang Anda gunakan bergantungslf4j:slf4j
(tepatnya, tidak ada artefak yang akan memiliki dependensi cakupan kompilasi atau dependensi runtime scopeslf4j:slf4j
)Latar belakang: Hibernate 4.x memiliki ketergantungan pada artefak
org.jboss.logging:jboss-logging
. Transitif, artefak ini memiliki disediakan lingkup ketergantungan pada artefakslf4j:slf4j
.Karena sekarang kita telah menambahkan
org.slf4j:log4j-over-slf4j
artefak,org.slf4j:log4j-over-slf4j
meniruslf4j:slf4j
artefak tersebut. Oleh karena itu, semua yangJBoss Logging
dicatat sekarang akan benar-benar melalui slf4j.Katakanlah Anda menggunakan Logback sebagai backend logging Anda. Ini contohnya
pom.xml
Di jalur kelas Anda, miliki
logback.xml
, seperti ini yang terletak disrc/main/java
:Beberapa komponen mungkin ingin memiliki akses ke
logback.xml
JVM waktu start-up untuk logging yang benar, misalnya Plugin Jetty Maven. Dalam hal ini, tambahkan sistem Javalogback.configurationFile=./path/to/logback.xml
ke perintah Anda (misalnyamvn -Dlogback.configurationFile=./target/classes/logback.xml jetty:run
).Jika Anda masih mendapatkan output Hibernate stdout konsol "mentah" (seperti
Hibernate: select ...
), maka pertanyaan Stack Overflow " Matikan logging hibernasi ke konsol " mungkin berlaku.sumber
org.jboss.logging.provider=slf4j
Pertama, Anda menyadari bahwa SLF4J bukanlah perpustakaan logging, itu pembungkus logging. Itu sendiri tidak mencatat apa pun, itu hanya mendelegasikan ke "backend".
Untuk "mengkonfigurasi" jboss-logging Anda cukup menambahkan kerangka kerja log apa pun yang ingin Anda gunakan pada classpath Anda (bersama dengan jboss-logging) dan jboss-logging mencari tahu sisanya.
Saya membuat panduan yang berfokus pada Hibernate untuk konfigurasi JBoss Logging: http://docs.jboss.org/hibernate/orm/4.3/topical/html/logging/Logging.html
sumber
org.jboss.logging.provider
properti sistem.Saya menggunakan Hibernate Core 4.1.7.Final plus Spring 3.1.2.RELEASE dalam aplikasi mandiri. Saya menambahkan Log4j 1.2.17 ke dependensi saya dan tampaknya, karena JBoss Logging langsung log ke log4j jika tersedia dan Spring menggunakan Commons Logging, penyihir juga menggunakan Log4j jika tersedia, semua Logging dapat dikonfigurasi melalui Log4J.
Inilah daftar dependensi saya yang relevan:
sumber
jadi, baru saja berfungsi di proyek saya. hibernate 4, slf4j, logback. proyek saya adalah gradle, tetapi harus sama untuk maven.
Pada dasarnya Abdull benar. Dimana dia TIDAK benar, adalah bahwa Anda TIDAK perlu menghapus slf4j dari dependensi.
termasuk untuk mengkompilasi ruang lingkup:
org.slf4j: slf4j-api
org.slf4j: log4j-over-slf4j
misalnya untuk logback (ch.qos.logback: logback-classic, ch.qos.logback: logback-core: 1.0.12)
mengecualikan sepenuhnya log4j libs dari dependensi
hasil: log hibernasi melalui slf4j untuk logback. tentu saja Anda harus dapat menggunakan implementasi log yang berbeda dari logback
untuk memastikan bahwa tidak ada log4j, periksa libs Anda di classpath atau web-inf / lib untuk file perang.
tentu saja Anda telah mengatur logger di logback.xml misalnya:
<logger name="org.hibernate.SQL" level="TRACE"/>
sumber
Hibernate 4.3 memiliki beberapa dokumentasi tentang cara mengontrol
org.jboss.logging
:Ini mencari jalur kelas untuk penyedia logging . Ia mencari slf4j setelah mencari log4j. Jadi, secara teori, memastikan bahwa classpath (WAR) Anda tidak menyertakan log4j dan tidak menyertakan API slf4j dan back-end seharusnya berfungsi.
Sebagai upaya terakhir, Anda dapat menyetel
org.jboss.logging.provider
properti sistem keslf4j
.Terlepas dari klaim dokumentasi,
org.jboss.logging
bersikeras untuk mencoba menggunakan log4j, meskipun log4j tidak ada dan SLF4J ada, menghasilkan pesan berikut di file log Tomcat saya (/var/log/tomcat/catalina.out
):Saya harus mengikuti saran jawaban oleh dasAnderl ausMinga dan memasukkan
log4j-over-slf4j
jembatan.sumber
Saya menggunakan maven dan menambahkan ketergantungan berikut:
Kemudian, saya membuat
log4j.properties
file di/src/main/resources
:Ini akan meletakkannya di root file
.jar
. Ini bekerja seperti pesona ...sumber
Saya mengalami masalah saat membuat logging hibernasi 4 bekerja dengan weblogic 12c dan log4j. Solusinya adalah dengan meletakkan yang berikut ini di weblogic-application.xml Anda:
sumber
Kepada siapa pun yang bisa menghadapi masalah yang sama dengan saya. Jika Anda telah mencoba semua solusi lain yang dijelaskan di sini dan masih tidak melihat logging hibernasi berfungsi dengan slf4j Anda, itu bisa jadi karena Anda menggunakan wadah yang memiliki pustaka jboss-logging.jar di foldernya. Ini berarti itu dimuat sebelum Anda bahkan dapat mengatur konfigurasi apa pun untuk mempengaruhinya. Untuk menghindari masalah ini dalam weblogic Anda dapat menentukan di file weblogic-application.xml di telinga Anda / META-INF agar lebih memilih perpustakaan yang dimuat dari aplikasi. harus ada mekanisme serupa untuk penampung server lainnya. Dalam kasus saya, saya harus menambahkan:
sumber
apakah kamu mencoba ini:
- slf4j-log4j12.jar dalam kasus Log4J. Lihat dokumentasi SLF4J untuk detail lebih lanjut. Untuk menggunakan Log4j, Anda juga perlu menempatkan file log4j.properties di classpath Anda. Contoh file properti didistribusikan dengan Hibernate di direktori src /
cukup tambahkan jars dan properti ini atau log4j xml di classpath
sumber