Konfigurasi Hibernate logging menggunakan file konfigurasi XML Log4j?

89

Saya belum dapat menemukan dokumentasi apa pun tentang cara mengkonfigurasi logging Hibernate menggunakan file konfigurasi gaya XML untuk Log4j.

Apakah ini mungkin atau apakah saya telah menggunakan file konfigurasi gaya properti untuk mengontrol logging Hibernate?

Jika ada yang memiliki informasi atau tautan ke dokumentasi, itu akan sangat dihargai.

EDIT:
Hanya untuk memperjelas, saya mencari contoh sintaks XML sebenarnya untuk mengontrol Hibernate.

EDIT2:
Inilah yang saya miliki di file konfigurasi XML saya.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="info"/>
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c{1} - %m%n"/>
        </layout>
    </appender>
    <appender name="rolling-file" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="Program-Name.log"/>
        <param name="MaxFileSize" value="1000KB"/>
    <!-- Keep one backup file -->
        <param name="MaxBackupIndex" value="4"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n"/>
        </layout>
    </appender>

    <root>
        <priority value ="debug" />
        <appender-ref ref="console" />
        <appender-ref ref="rolling-file" />
    </root>
</log4j:configuration>

Logging berfungsi dengan baik tetapi saya mencari cara untuk mundur dan mengontrol logging hibernate dengan cara yang terpisah dari logging level aplikasi saya, karena saat ini membanjiri log saya. Saya telah menemukan contoh penggunaan file preferensi untuk melakukan ini, saya hanya bertanya-tanya bagaimana saya bisa melakukan ini dalam file XML.

James McMahon
sumber
nemo, apakah ypu pernah mengetahui bagaimana melakukan ini dengan cara xml? Mungkin Anda bisa memposting jawaban atas pertanyaan Anda jika ya.
homaxto
homaxto, saya lakukan. Saya akan mempostingnya untuk Anda setelah saya mendapat kesempatan.
James McMahon
<appender-ref ref = "console" /> apakah log hibernasi itu juga ke catalina.out, Anda harus mengomentari tag ini jika Anda tidak ingin melihat catalina.out penuh dengan log hibernate
Enrique San Martín

Jawaban:

162

Dari http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-logging

Berikut daftar kategori logger:

Category                    Function

org.hibernate.SQL           Log all SQL DML statements as they are executed
org.hibernate.type          Log all JDBC parameters
org.hibernate.tool.hbm2ddl  Log all SQL DDL statements as they are executed
org.hibernate.pretty        Log the state of all entities (max 20 entities) associated with the session at flush time
org.hibernate.cache         Log all second-level cache activity
org.hibernate.transaction   Log transaction related activity
org.hibernate.jdbc          Log all JDBC resource acquisition
org.hibernate.hql.ast.AST   Log HQL and SQL ASTs during query parsing
org.hibernate.secure        Log all JAAS authorization requests
org.hibernate               Log everything (a lot of information, but very useful for troubleshooting) 

Diformat untuk ditempel ke dalam file konfigurasi XML log4j:

<!-- Log all SQL DML statements as they are executed -->
<Logger name="org.hibernate.SQL" level="debug" />
<!-- Log all JDBC parameters -->
<Logger name="org.hibernate.type" level="debug" />
<!-- Log all SQL DDL statements as they are executed -->
<Logger name="org.hibernate.tool.hbm2ddl" level="debug" />
<!-- Log the state of all entities (max 20 entities) associated with the session at flush time -->
<Logger name="org.hibernate.pretty" level="debug" />
<!-- Log all second-level cache activity -->
<Logger name="org.hibernate.cache" level="debug" />
<!-- Log transaction related activity -->
<Logger name="org.hibernate.transaction" level="debug" />
<!-- Log all JDBC resource acquisition -->
<Logger name="org.hibernate.jdbc" level="debug" />
<!-- Log HQL and SQL ASTs during query parsing -->
<Logger name="org.hibernate.hql.ast.AST" level="debug" />
<!-- Log all JAAS authorization requests -->
<Logger name="org.hibernate.secure" level="debug" />
<!-- Log everything (a lot of information, but very useful for troubleshooting) -->
<Logger name="org.hibernate" level="debug" />

NB: Sebagian besar penebang menggunakan tingkat DEBUG, namun org.hibernate.type menggunakan TRACE. Dalam versi Hibernate org.hibernate.type sebelumnya juga menggunakan DEBUG, tetapi pada Hibernate 3 Anda harus mengatur level ke TRACE (atau ALL) untuk melihat logging pengikatan parameter JDBC.

Dan kategori ditentukan seperti itu:

<logger name="org.hibernate">
    <level value="ALL" />
    <appender-ref ref="FILE"/>
</logger>

Ini harus ditempatkan sebelum elemen root.

Loki
sumber
Saya tidak yakin apa yang <appender-ref> lakukan di sana, ketika saya mengubahnya menjadi appender di konfigurasi saya, hibernasi tampaknya masih masuk ke konsol dan appender file saya. Aneh.
James McMahon
Ini aneh, dalam Hibernate 3.2.6 untuk org.hibernate.type Anda dapat menggunakan level DEBUG dan mencatat semua parameter. Dalam hibernate 3.5.6 DEBUG tidak cukup, Anda harus meletakkan TRACE, yang IMHO ok (setelah Anda mengetahuinya) karena itu benar-benar mencatat banyak!
Riccardo Cossu
Nama kelas telah direfraktorisasi pada Hibernate 4.2 sehingga untuk pencatatan transaksi Anda harus menggunakan org.hibernate.engine.transaction. Lihat: docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/…
gerrytan
Anda juga dapat menambahkan logger ke standalone.xml seperti berikut: <logger categoriy = "org.hibernate"> <level name = "DEBUG" /> </logger>
cw24
1
Haruskah Lin, misalnya, <Logger name="org.hibernate.SQL" level="debug" />benar-benar dikapitalisasi? Saya mendapatkan error di Tomcat pada startup ketika memanfaatkan L: "The content of element type 'log4j:configuration' must match '(renderer*,throwableRenderer*,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)'.". Saya juga bingung tentang bagaimana seharusnya ini dimasukkan ke file log4j.xml saya. Haruskah saya memiliki <logger>blok terpisah untuk setiap kategori, lengkap dengan <level>tagnya, atau dapatkah saya lolos dengan satu baris yang Anda berikan?
MegaMatt
25

Loki 's jawaban poin ke Hibernate 3 dokumen, dan menyediakan informasi yang baik, tapi aku masih tidak mendapatkan hasil yang saya harapkan.

Banyak meronta-ronta, melambai-lambaikan tangan, dan tikus mati secara umum akhirnya memberi saya kejayaan.

Karena Hibernate 3 menggunakan Simple Logging Facade for Java (SLF4J) (sesuai dokumen), jika Anda mengandalkan Log4j 1.2 Anda juga memerlukan slf4j-log4j12-1.5.10.jar jika Anda ingin sepenuhnya mengkonfigurasi logging Hibernasi dengan file konfigurasi log4j. Semoga ini bisa membantu orang berikutnya.

Dennis S
sumber
Yup, Anda memerlukan slf4j-log4j12-1.5.10.jar untuk memasang fasad ke lapisan logging yang mendasarinya. File konfigurasi masih merupakan konfigurasi log4j jika Anda menggunakan log4j sebagai lapisan logging.
James McMahon
7

Menanggapi komentar homaxto, inilah yang saya miliki sekarang.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="debug"/>
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c{1} - %m%n"/>
        </layout>
    </appender>
    <appender name="rolling-file" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="Program-Name.log"/>
        <param name="MaxFileSize" value="500KB"/>
        <param name="MaxBackupIndex" value="4"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n"/>
        </layout>
    </appender>

    <logger name="org.hibernate">
        <level value="info" />
    </logger>

    <root>
        <priority value ="debug" />
        <appender-ref ref="console" />
        <appender-ref ref="rolling-file" />
    </root>
</log4j:configuration>

Bagian kuncinya

<logger name="org.hibernate">
    <level value="info" />
</logger>

Semoga ini membantu.

James McMahon
sumber
5

Inilah yang saya gunakan:

<logger name="org.hibernate">
    <level value="warn"/>
</logger>

<logger name="org.hibernate.SQL">
    <level value="warn"/>
</logger>

<logger name="org.hibernate.type">
    <level value="warn"/>
</logger>

<root>
    <priority value="info"/>
    <appender-ref ref="C1"/>
</root> 

Jelas, saya tidak suka melihat pesan Hibernate;) - setel level ke "debug" untuk mendapatkan hasilnya.

TMN
sumber
3

Jawabannya berguna. Setelah perubahan, saya mendapat pencatatan duplikat pernyataan SQL, satu di file log log4j dan satu lagi di konsol standar. Saya mengubah file persistence.xml menjadi show_sql menjadi false untuk menghilangkan logging dari konsol standar. Menjaga format_sql benar juga mempengaruhi file log log4j, jadi saya menyimpannya benar.

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0">
    <persistence-unit name="myUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:file:d:\temp\database\cap1000;shutdown=true"></property>
            <property name="dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.connection.username" value="sa"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        </properties>
    </persistence-unit>
</persistence>
dc360
sumber
0

Anda dapat mengonfigurasi log4jfile Anda dengan tag kategori seperti ini (dengan penambah konsol sebagai contoh):

<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yy-MM-dd HH:mm:ss} %p %c - %m%n" />
    </layout>
</appender>
<category name="org.hibernate">
    <priority value="WARN" />
</category>
<root>
    <priority value="INFO" />
    <appender-ref ref="console" />
</root>

Jadi setiap peringatan, kesalahan atau pesan fatal dari hibernate akan ditampilkan, tidak lebih. Selain itu, kode dan kode perpustakaan Anda akan berada di tingkat info (jadi info, peringatan, kesalahan dan fatal)

Untuk mengubah tingkat log perpustakaan, cukup tambahkan kategori, misalnya, ke log info musim semi yang tidak aktif:

<category name="org.springframework">
    <priority value="WARN" />
</category>

Atau dengan appender lain, hentikan aditivitas (nilai default aditivitas adalah benar)

<category name="org.springframework" additivity="false">
    <priority value="WARN" />
    <appender-ref ref="anotherAppender" />
</category>

Dan jika Anda tidak ingin hibernasi mencatat setiap kueri, setel properti hibernasi show_sqlke false.

Emilien Brigand
sumber