Konfigurowanie rejestrowania w trybie hibernacji przy użyciu pliku konfiguracyjnego Log4j XML?

89

Nie udało mi się znaleźć żadnej dokumentacji, jak skonfigurować logowanie Hibernate za pomocą pliku konfiguracyjnego w stylu XML dla Log4j.

Czy jest to w ogóle możliwe, czy też mam użyć pliku konfiguracyjnego stylu właściwości do kontrolowania logowania Hibernate?

Będziemy wdzięczni, jeśli ktoś ma jakieś informacje lub linki do dokumentacji.

EDYCJA:
Żeby wyjaśnić, szukam przykładu rzeczywistej składni XML do sterowania Hibernacją.

EDIT2:
Oto, co mam w moim pliku konfiguracyjnym XML.

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

Rejestrowanie działa dobrze, ale szukam sposobu, aby zmniejszyć i kontrolować rejestrowanie hibernacji w sposób oddzielny od rejestrowania na poziomie aplikacji, ponieważ obecnie zalewa moje dzienniki. Znalazłem przykłady wykorzystania pliku preferencji, aby to zrobić, zastanawiałem się tylko, jak mogę to zrobić w pliku XML.

James McMahon
źródło
nemo, czy ypu kiedykolwiek dowiedział się, jak to zrobić w XML? Może mógłbyś opublikować odpowiedź na swoje pytanie, gdybyś to zrobił.
homaxto
homaxto, tak. Opublikuję to dla Ciebie, gdy tylko będę miał okazję.
James McMahon
<appender-ref ref = "console" /> robi, że dziennik hibernacji trafia również do catalina.out, powinieneś skomentować ten tag, jeśli nie chcesz widzieć catalina.out pełnego logów hibernacji
Enrique San Martín

Odpowiedzi:

162

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

Oto lista kategorii rejestratorów:

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) 

Sformatowano do wklejenia do pliku konfiguracyjnego 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" />

Uwaga: Większość loggerów używa poziomu DEBUG, jednak org.hibernate.type używa TRACE. W poprzednich wersjach Hibernate org.hibernate.type również używał DEBUG, ale od Hibernate 3 musisz ustawić poziom na TRACE (lub ALL), aby zobaczyć rejestrowanie powiązań parametrów JDBC.

Kategoria jest określona jako taka:

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

Musi być umieszczony przed elementem głównym.

Loki
źródło
Nie jestem pewien, co tam robi <appender-ref>, kiedy zmieniam go na appender w mojej konfiguracji, hibernacja nadal wydaje się logować zarówno do konsoli, jak i do mojego appendera. Dziwne.
James McMahon
To dziwne, w Hibernate 3.2.6 dla org.hibernate.type można użyć poziomu DEBUG i rejestruje on wszystkie parametry. W hibernacji 3.5.6 DEBUG nie wystarczy, musisz umieścić TRACE, który jest IMHO ok (kiedy już to znasz), ponieważ naprawdę dużo loguje!
Riccardo Cossu
Nazwa klasy została zmieniona w Hibernate 4.2, więc do rejestrowania transakcji musisz użyć org.hibernate.engine.transaction. Zobacz: docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/…
gerrytan
Możesz również dodać loggery do standalone.xml w następujący sposób: <logger categoriy = "org.hibernate"> <level name = "DEBUG" /> </logger>
cw24
1
Czy L, na przykład, <Logger name="org.hibernate.SQL" level="debug" />faktycznie należy wpisać wielką literę? I pojawia się błąd w Tomcat na starcie, kiedy czerpanie L: "The content of element type 'log4j:configuration' must match '(renderer*,throwableRenderer*,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)'.". Jestem również zdezorientowany, jak to właściwie powinno być wprowadzone do mojego pliku log4j.xml. Czy powinienem mieć osobny <logger>blok dla każdej kategorii, wraz z <level>tagami, czy mogę uciec z przedstawionymi przez Ciebie jednowierszowymi?
MegaMatt
25

Loki jest odpowiedź wskazuje na Hibernate 3 docs i zapewnia dobre informacje, ale nie został jeszcze uzyskanie wyników się spodziewałem.

Wiele szarpnięć, wymachiwania rękami i ogólnymi biegami martwych myszy w końcu wylądowało we mnie.

Ponieważ Hibernate 3 używa Simple Logging Facade for Java (SLF4J) (zgodnie z dokumentacją), jeśli korzystasz z Log4j 1.2, będziesz również potrzebować slf4j-log4j12-1.5.10.jar, jeśli chcesz w pełni skonfigurować logowanie Hibernacji z plik konfiguracyjny log4j. Mam nadzieję, że to pomoże następnemu facetowi.

Dennis S
źródło
Tak, potrzebujesz slf4j-log4j12-1.5.10.jar, aby połączyć elewację z podstawową warstwą logowania. Plik konfiguracyjny nadal jest konfiguracją log4j, jeśli używasz log4j jako warstwy rejestrowania.
James McMahon,
7

W odpowiedzi na komentarz homaxto, oto co mam teraz.

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

Kluczowa część jest

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

Mam nadzieję że to pomoże.

James McMahon
źródło
5

Oto czego używam:

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

Oczywiście nie lubię oglądać komunikatów hibernacji;) - ustaw poziom na „debug”, aby uzyskać wynik.

TMN
źródło
3

Odpowiedzi były przydatne. Po zmianie otrzymałem zduplikowane logowanie instrukcji SQL, jedno w pliku log4j, a drugie na standardowej konsoli. Zmieniłem plik persistence.xml, aby powiedzieć show_sql na false, aby pozbyć się logowania ze standardowej konsoli. Zachowanie true format_sql wpływa również na plik dziennika log4j, więc zachowałem tę prawdę.

<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
źródło
0

Możesz skonfigurować swój log4jplik z tagiem kategorii w następujący sposób (na przykład z aplikatorem konsoli):

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

Więc każde ostrzeżenie, błąd lub krytyczny komunikat z hibernacji zostanie wyświetlony, nic więcej. Ponadto twój kod i kod biblioteki będą na poziomie informacyjnym (więc informacje, ostrzeżenia, błędy i krytyczne)

Aby zmienić poziom dziennika biblioteki, po prostu dodaj kategorię, na przykład, aby dezaktywować dziennik informacyjny sprężyny:

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

Lub z innym aplikatorem przerwij addytywność (domyślną wartością addytywności jest prawda)

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

A jeśli nie chcesz, aby hibernacja rejestrowała każde zapytanie, ustaw właściwość hibernacji show_sqlna false.

Emilien Brigand
źródło