Pergunta

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

Isso é possível ou eu uso um arquivo de configuração de estilo de propriedades para controlar o log de Hibernate?

Se alguém tiver alguma informação ou links para a documentação, isso apreciaria.

EDITAR:
Apenas para esclarecer, estou procurando um exemplo da sintaxe XML real para controlar o Hibernate.

Edit2:
Aqui está o que eu 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 renunciar e controlar o log de Hibernate, que se separa do meu registro de nível de aplicativo, pois atualmente está inundando meus logs. Encontrei exemplos de usar o arquivo de preferência para fazer isso, eu estava me perguntando como posso fazer isso em um arquivo XML.

Foi útil?

Solução

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

Aqui está a lista de categorias de madeireiro:

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 Log4J XML:

<!-- 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 madeireiros usa o nível de depuração, no entanto, org.hibernate.type usa rastreio. Nas versões anteriores do hibernate org.hibernate.type também usou a depuração, mas a partir do hibernato 3 você deve definir o nível para rastrear (ou tudo) para ver o log de ligação ao parâmetro JDBC.

E uma categoria é especificada como tal:

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

Deve ser colocado antes do elemento raiz.

Outras dicas

Loki's responda aponta para o Hibernate 3 docs e fornece boas informações, mas eu ainda não estava obtendo os resultados que esperava.

Muita batalha, acenando com armas e as corridas gerais de mouse morta finalmente me levaram a meu queijo.

Porque o hibernato 3 está usando Fachada de madeira simples para java (Slf4j) (de acordo com os documentos), E se você está confiando no log4j 1.2 você vai também Precisa do slf4j-log4j12-1.5.10.jar Se você quer totalmente Configure o log de hibernato com um arquivo de configuração log4j. Espero que isso ajude o próximo cara.

Em resposta ao comentário de Homaxto, é isso que 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.

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 as mensagens de hibernação;) - defina o nível como "depuração" para obter a saída.

As respostas foram úteis. Após a alteração, obtive o log duplicado de instruções SQL, uma no arquivo de log Log4J e outro no console padrão. Eu mudei o arquivo persistence.xml para dizer show_sql para false para se livrar do log do console padrão. Manter o format_sql true também afeta o arquivo log4j de log, então eu 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>

Você pode configurar seu log4j Arquivo com a tag de categoria como esta (com um Appender do 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, todo aviso, erro ou mensagem fatal do Hibernate será exibida, nada mais. Além disso, seu código e código da biblioteca estarão no nível de informação (portanto, informações, aviso, erro e fatal)

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

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

Ou com outro appender, 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 esse hibernate registre todas as consultas, defina a propriedade Hibernate show_sql para false.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top