Konfigurieren der Ruhezustandsprotokollierung mithilfe der Log4j-XML-Konfigurationsdatei?

89

Ich konnte keine Dokumentation zum Konfigurieren der Protokollierung von Hibernate mithilfe der XML-Konfigurationsdatei für Log4j finden.

Ist dies überhaupt möglich oder habe ich eine Konfigurationsdatei im Eigenschaftenstil verwendet, um die Protokollierung von Hibernate zu steuern?

Wenn jemand Informationen oder Links zur Dokumentation hat, wäre er dankbar.

EDIT:
Zur Verdeutlichung suche ich nach einem Beispiel für die tatsächliche XML-Syntax zur Steuerung des Ruhezustands.

EDIT2: Folgendes habe
ich in meiner XML-Konfigurationsdatei.

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

Die Protokollierung funktioniert einwandfrei, aber ich suche nach einer Möglichkeit, die Protokollierung im Ruhezustand so zu steuern, dass sie von der Protokollierung auf Anwendungsebene getrennt ist, da sie derzeit meine Protokolle überflutet. Ich habe Beispiele für die Verwendung der Voreinstellungsdatei gefunden. Ich habe mich nur gefragt, wie ich dies in einer XML-Datei tun kann.

James McMahon
quelle
Nemo, hast du jemals herausgefunden, wie man das auf XML-Weise macht? Vielleicht könnten Sie eine Antwort auf Ihre Frage posten, wenn Sie dies tun würden.
Homaxto
Homaxto habe ich getan. Ich werde das für dich posten, sobald ich eine Chance habe.
James McMahon
<appender-ref ref = "console" /> führt das Protokoll für den Ruhezustand auch zu Catalina.out. Sie sollten dieses Tag kommentieren, wenn Sie Catalina.out nicht mit Protokollen für den Ruhezustand sehen möchten
Enrique San Martín

Antworten:

161

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

Hier ist die Liste der Logger-Kategorien:

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) 

Formatiert zum Einfügen in eine log4j XML-Konfigurationsdatei:

<!-- 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: Die meisten Logger verwenden die DEBUG-Ebene, jedoch verwendet org.hibernate.type TRACE. In früheren Versionen von Hibernate hat org.hibernate.type ebenfalls DEBUG verwendet. Ab Hibernate 3 müssen Sie die Ebene jedoch auf TRACE (oder ALL) setzen, damit die Protokollierung der JDBC-Parameterbindung angezeigt wird.

Und eine Kategorie wird als solche angegeben:

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

Es muss vor dem Stammelement stehen.

Loki
quelle
Ich bin nicht sicher, was <appender-ref> dort tut. Wenn ich es in meiner Konfiguration in einen Appender ändere, scheint der Ruhezustand immer noch sowohl bei der Konsole als auch bei meinem Dateianhänger zu protokollieren. Seltsam.
James McMahon
Dies ist seltsam. In Hibernate 3.2.6 für org.hibernate.type können Sie die DEBUG-Ebene verwenden und alle Parameter protokollieren. Im Ruhezustand 3.5.6 reicht DEBUG nicht aus, Sie müssen TRACE setzen, was meiner Meinung nach in Ordnung ist (sobald Sie es wissen), da es wirklich viel protokolliert!
Riccardo Cossu
Der Klassenname wurde in Hibernate 4.2 überarbeitet, sodass Sie ihn für die Protokollierung von Transaktionen verwenden müssen org.hibernate.engine.transaction. Siehe: docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/…
Gerrytan
Sie können die Logger auch wie folgt zur standalone.xml hinzufügen: <logger categoryiy = "org.hibernate"> <level name = "DEBUG" /> </
logger
1
Sollte das LIn zum Beispiel <Logger name="org.hibernate.SQL" level="debug" />tatsächlich aktiviert werden? Ich erhalte beim Start einen Fehler in Tomcat, wenn ich das L: groß schreibe "The content of element type 'log4j:configuration' must match '(renderer*,throwableRenderer*,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)'.". Ich bin auch verwirrt darüber, wie dies tatsächlich in meine log4j.xml-Datei eingegeben werden soll. Sollte ich <logger>für jede Kategorie einen eigenen Block mit den <level>Tags haben oder kann ich mit den von Ihnen präsentierten Einzeilern davonkommen?
MegaMatt
25

Loki ‚s Antwort verweist auf die Hibernate 3 docs und bietet gute Informationen, aber ich war immer noch nicht immer die Ergebnisse , die ich erwartet hatte.

Viel Schlagen, Winken der Arme und allgemeine tote Mausläufe brachten mir schließlich meinen Käse.

Da Hibernate 3 Simple Logging Facade für Java (SLF4J) verwendet (gemäß den Dokumenten), benötigen Sie , wenn Sie sich auf Log4j 1.2 verlassen, auch die Datei slf4j-log4j12-1.5.10.jar, wenn Sie die Hibernate-Protokollierung vollständig konfigurieren möchten eine log4j-Konfigurationsdatei. Hoffe das hilft dem nächsten Kerl.

Dennis S.
quelle
Ja, Sie benötigen das slf4j-log4j12-1.5.10.jar, um die Fassade mit der darunter liegenden Protokollierungsschicht zu verbinden. Die Konfigurationsdatei ist immer noch eine log4j-Konfiguration, wenn Sie log4j als Protokollierungsschicht verwenden.
James McMahon
7

Als Antwort auf den Kommentar von homaxto habe ich dies gerade.

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

Der Schlüsselteil ist

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

Hoffe das hilft.

James McMahon
quelle
5

Folgendes verwende ich:

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

Offensichtlich möchte ich keine Hibernate-Nachrichten sehen;) - setze den Level auf "debug", um die Ausgabe zu erhalten.

TMN
quelle
3

Die Antworten waren nützlich. Nach der Änderung wurde die SQL-Anweisung doppelt protokolliert, eine in der Protokolldatei log4j und eine in der Standardkonsole. Ich habe die Datei persistence.xml in show_sql in false geändert, um die Protokollierung von der Standardkonsole zu entfernen. Das Beibehalten von format_sql true wirkt sich auch auf die log4j-Protokolldatei aus, daher habe ich das true beibehalten.

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

Sie können Ihre log4jDatei mit dem Kategorie-Tag wie folgt konfigurieren (mit einem Konsolen-Appender für das Beispiel):

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

So wird jede Warnung, jeder Fehler oder jede schwerwiegende Meldung aus dem Ruhezustand angezeigt, nicht mehr. Außerdem befinden sich Ihr Code und Ihr Bibliothekscode auf Info-Ebene (also Info, Warnung, Fehler und schwerwiegend).

Um die Protokollstufe einer Bibliothek zu ändern, fügen Sie einfach eine Kategorie hinzu, z. B. zum desaktiven Frühlingsinformationsprotokoll:

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

Oder brechen Sie mit einem anderen Appender die Additivität (der Standardwert für die Additivität ist true).

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

Wenn Sie nicht möchten, dass das Ruhezustandsprotokoll bei jeder Abfrage protokolliert wird, setzen Sie die Eigenschaft show_sqlfür den Ruhezustand auf false.

Emilien Brigand
quelle