¿Configurando el registro de Hibernate usando el archivo de configuración XML Log4j?

89

No he podido encontrar ninguna documentación sobre cómo configurar el registro de Hibernate usando el archivo de configuración de estilo XML para Log4j.

¿Es esto posible o tengo que usar un archivo de configuración de estilo de propiedades para controlar el registro de Hibernate?

Si alguien tiene información o enlaces a la documentación, lo agradecería.

EDITAR:
Solo para aclarar, estoy buscando un ejemplo de la sintaxis XML real para controlar Hibernate.

EDIT2: Esto
es lo que tengo en mi archivo de configuración 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>

El registro funciona bien, pero estoy buscando una manera de reducir y controlar el registro de hibernación de una manera que se separe del registro de mi aplicación, ya que actualmente está inundando mis registros. Encontré ejemplos del uso del archivo de preferencias para hacer esto, solo me preguntaba cómo puedo hacer esto en un archivo XML.

James McMahon
fuente
nemo, ¿alguna vez descubrió ypu cómo hacer esto de forma xml? Tal vez podrías publicar una respuesta a tu pregunta si lo hicieras.
homaxto
homaxto, lo hice. Te lo publicaré una vez que tenga la oportunidad.
James McMahon
<appender-ref ref = "console" /> hace que el registro de hibernación vaya también a catalina.out, debes comentar esta etiqueta si no quieres ver el registro de hibernación lleno de catalina.out
Enrique San Martín

Respuestas:

161

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

Aquí está la lista de categorías de registradores:

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) 

Formateado para pegar en un archivo de configuración 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: La mayoría de los registradores usan el nivel DEBUG, sin embargo org.hibernate.type usa TRACE. En versiones anteriores de Hibernate, org.hibernate.type también usaba DEBUG, pero a partir de Hibernate 3 debe establecer el nivel en TRACE (o ALL) para ver el registro de enlace de parámetros JDBC.

Y una categoría se especifica como tal:

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

Debe colocarse antes del elemento raíz.

Loki
fuente
No estoy seguro de qué está haciendo <appender-ref> allí, cuando lo cambio a un appender en mi configuración, hibernate todavía parece iniciar sesión tanto en la consola como en mi appender de archivos. Extraño.
James McMahon
Esto es extraño, en Hibernate 3.2.6 para org.hibernate.type puedes usar el nivel DEBUG y registra todos los parámetros. En hibernate 3.5.6 DEBUG no es suficiente, tienes que poner TRACE, que en mi humilde opinión está bien (una vez que lo sabes) ¡ya que realmente registra mucho!
Riccardo Cossu
El nombre de la clase se refactorizó en Hibernate 4.2, por lo que para el registro de transacciones debe usarlo org.hibernate.engine.transaction. Ver: docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/…
gerrytan
También puede agregar los registradores al archivo standalone.xml de la siguiente manera: <logger categoriy = "org.hibernate"> <level name = "DEBUG" /> </logger>
cw24
1
Por Lejemplo, ¿ <Logger name="org.hibernate.SQL" level="debug" />debería escribirse en mayúscula? Me aparece un error en Tomcat en el inicio cuando la capitalización de la L: "The content of element type 'log4j:configuration' must match '(renderer*,throwableRenderer*,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)'.". También estoy confundido acerca de cómo esto debería ingresarse en mi archivo log4j.xml. ¿Debería tener un <logger>bloque separado para cada categoría, completo con las <level>etiquetas, o puedo salirse con la suya con las frases breves que presentó?
MegaMatt
25

La respuesta de Loki apunta a los documentos de Hibernate 3 y proporciona buena información, pero todavía no obtenía los resultados que esperaba.

Muchas palizas, movimientos de brazos y carreras de ratones muertos en general finalmente me consiguieron el queso.

Debido a que Hibernate 3 usa Simple Logging Facade para Java (SLF4J) (según los documentos), si confía en Log4j 1.2, también necesitará slf4j-log4j12-1.5.10.jar si desea configurar completamente el registro de Hibernate con un archivo de configuración log4j. Espero que esto ayude al próximo chico.

Dennis S
fuente
Sí, necesita slf4j-log4j12-1.5.10.jar para conectar la fachada a la capa de registro subyacente. El archivo de configuración sigue siendo una configuración de log4j si está utilizando log4j como capa de registro.
James McMahon
7

En respuesta al comentario de homaxto, esto es lo que tengo ahora.

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

La parte clave es

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

Espero que esto ayude.

James McMahon
fuente
5

Esto es lo que uso:

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

Obviamente, no me gusta ver mensajes de Hibernate;) - configure el nivel en "debug" para obtener el resultado.

TMN
fuente
3

Las respuestas fueron útiles. Después del cambio, obtuve un registro duplicado de declaraciones SQL, una en el archivo de registro log4j y otra en la consola estándar. Cambié el archivo persistence.xml para que diga show_sql a falso para deshacerme del registro desde la consola estándar. Mantener format_sql verdadero también afecta el archivo de registro log4j, así que mantuve eso cierto.

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

Puede configurar su log4jarchivo con la etiqueta de categoría como esta (con un appender de consola para el ejemplo):

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

Por lo tanto, se mostrarán todas las advertencias, errores o mensajes fatales de hibernación, nada más. Además, su código y el código de la biblioteca estarán en el nivel de información (por lo tanto, información, advertencia, error y fatal)

Para cambiar el nivel de registro de una biblioteca, simplemente agregue una categoría, por ejemplo, para desactivar el registro de información de primavera:

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

O con otro appender, rompa la aditividad (el valor predeterminado de aditividad es verdadero)

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

Y si no desea que la hibernación registre cada consulta, establezca la propiedad de hibernación show_sqlen false.

Emilien Brigand
fuente