Configurando o registro do Hibernate usando o arquivo de configuração XML Log4j?

89

Não consegui encontrar nenhuma documentação sobre como configurar o registro do Hibernate usando o arquivo de configuração de estilo XML para Log4j.

Isso é possível ou devo usar um arquivo de configuração de estilo de propriedades para controlar o registro do Hibernate?

Se alguém tiver informações ou links para documentação, agradecemos.

EDIT:
Só para esclarecer, estou procurando um exemplo da sintaxe XML real para controlar o Hibernate.

EDIT2:
Aqui está o que tenho no meu arquivo de configuração 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>

O registro funciona bem, mas estou procurando uma maneira de diminuir e controlar o registro de hibernação de uma maneira que se separe do registro em nível de aplicativo, pois atualmente está inundando meus registros. Eu encontrei exemplos de como usar o arquivo de preferência para fazer isso, só queria saber como posso fazer isso em um arquivo XML.

James McMahon
fonte
nemo, você já descobriu como fazer isso da maneira xml? Talvez você possa postar uma resposta à sua pergunta, se o fizer.
homaxto
homaxto, eu fiz. Vou postar isso para você assim que tiver uma chance.
James McMahon
<appender-ref ref = "console" /> faz com que o log de hibernação vá também para catalina.out, você deve comentar esta tag se não quiser ver o catalina.out cheio de logs de hibernação
Enrique San Martín

Respostas:

161

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

Aqui está a lista de categorias 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) 

Formatado para colar em um arquivo de configuração 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: A maioria dos loggers usa o nível DEBUG, entretanto org.hibernate.type usa TRACE. Nas versões anteriores do Hibernate org.hibernate.type também usava DEBUG, mas a partir do Hibernate 3 você deve definir o nível para TRACE (ou ALL) para ver o registro de ligação dos parâmetros JDBC.

E uma categoria é especificada como:

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

Deve ser colocado antes do elemento raiz.

Loki
fonte
Não tenho certeza do que <appender-ref> está fazendo lá, quando eu mudo para um appender em minha configuração, o hibernate ainda parece registrar no console e no meu appender de arquivo. Estranho.
James McMahon
Isso é estranho, no Hibernate 3.2.6 para org.hibernate.type você pode usar o nível DEBUG e ele registra todos os parâmetros. No hibernate 3.5.6 DEBUG não é suficiente, você tem que colocar TRACE, que IMHO ok (assim que você souber) já que ele realmente loga muito!
Riccardo Cossu
O nome da classe foi refatorado no Hibernate 4.2 para que você precise usar o registro de transações org.hibernate.engine.transaction. Consulte: docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/…
gerrytan
Você também pode adicionar os registradores ao standalone.xml como a seguir: <logger categoriy = "org.hibernate"> <level name = "DEBUG" /> </logger>
cw24
1
Deve L, por exemplo, <Logger name="org.hibernate.SQL" level="debug" />ser realmente maiúsculo? Eu recebo um erro no Tomcat na inicialização quando a capitalização do L: "The content of element type 'log4j:configuration' must match '(renderer*,throwableRenderer*,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)'.". Também estou confuso sobre como isso realmente deve ser inserido no meu arquivo log4j.xml. Devo ter um <logger>bloco separado para cada categoria, completo com as <level>tags, ou posso me safar com as frases simples que você apresentou?
MegaMatt
25

A resposta de Loki aponta para a documentação do Hibernate 3 e fornece boas informações, mas eu ainda não estava obtendo os resultados que esperava.

Muitas sacudidelas, agitações de braços e corridas de ratos mortos em geral me deram o meu queijo.

Como o Hibernate 3 está usando o Simple Logging Facade for Java (SLF4J) (de acordo com os documentos), se você está contando com o Log4j 1.2, você também precisará do slf4j-log4j12-1.5.10.jar se quiser configurar totalmente o registro do Hibernate com um arquivo de configuração log4j. Espero que isso ajude o próximo cara.

Dennis S
fonte
Sim, você precisa do slf4j-log4j12-1.5.10.jar para conectar a fachada à camada de registro subjacente. O arquivo de configuração ainda é uma configuração log4j se você estiver usando log4j como a camada de registro.
James McMahon
7

Em resposta ao comentário de homaxto, é isso que eu tenho agora.

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

A parte principal é

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

Espero que isto ajude.

James McMahon
fonte
5

Aqui está o que eu 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, não gosto de ver mensagens do Hibernate;) - defina o nível como "debug" para obter a saída.

TMN
fonte
3

As respostas foram úteis. Após a alteração, obtive registro duplicado de instruções SQL, uma no arquivo de log log4j e outra no console padrão. Mudei o arquivo persistence.xml para dizer show_sql para false para me livrar do registro do console padrão. Manter format_sql true também afeta o arquivo de log log4j, portanto, mantive isso verdadeiro.

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

Você pode configurar seu log4jarquivo com a tag de categoria assim (com um anexador de console para o exemplo):

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

Portanto, todos os avisos, erros ou mensagens fatais de hibernação serão exibidos, nada mais. Além disso, seu código e código de biblioteca estarão no nível de informação (portanto, info, aviso, erro e fatal)

Para alterar o nível de registro de uma biblioteca, basta adicionar uma categoria, por exemplo, ao registro de informações da primavera desativa:

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

Ou com outro anexador, quebre a aditividade (o valor padrão da aditividade é verdadeiro)

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

E se você não quiser que o hibernate registre todas as consultas, defina a propriedade hibernate show_sqlcomo false.

Emilien Brigand
fonte