Por que o Hibernate 4 não mostra os logs no Log4j2

Depois de configurar o Log4j2 como descrevi aqui estava tudo funcionando da forma como queria, só tinha um porém, os logs do Hibernate 4 não apareciam, na console aparecia a query e nada mais.

Depois de fazer uma longa pesquisa no oráculo nosso de cada dia (leia-se google) encontrei diversas pessoas com o mesmo problema, só que não existe uma solução que atenda a todos, por isso vou contar um pouco de história e explicar como eu consegui resolver esse problema, let’s go.

Um pouco de história…

Vou começar explicando por que considero essa parte importante,  o contexto e o background do problema podem ajudar a outras pessoas que possuem um cenário diferente do meu e dessa forma adaptar ao seu cenário.

Pra começo de conversa desde a versão 4 o Hibernate utiliza o Jboss Logging como fachada para implementação de logs, anteriormente era utilizada o Slf4j,  é esse o nosso ponto de partida. Até a última versão do Hibernate (4.3.9.Final no momento em que escrevo esse texto) a dependência do JBoss Logging é a 3.1.3.GA e a mesma não possui suporte para Log4j2.

Buscando ser compatível com o Log4j2 o time do Jboss Logging resolveu  implementar essa compatibilidade na versão 3.2.0.Beta1 que foi baseada, adivinhem em qual versão do Log4j2?!? em uma versão também beta do Log4j2. Só que o time do Log4j2 mudou a API e quebrou a compatibilidade da versão 3.2.0.Beta1, somente a partir da versão 3.2.1.Beta2 do Jboss Logging é que de fato a integração com o Log4j2 funciona a contento.

Solução

A solução para usar o Hibernate 4 com o Log4j2 é sobrescrever a dependência do Jboss Logging, substituindo a versão 3.1.3.GA com a versão 3.2.1.Beta2 ou superior. No momento que escrevo esse post a última versão é 3.2.1.Final e foi ela que usei. Para quem usa maven basta adicionar a dependência no pom.xml da seguinte forma:


<dependency>
    <groupId>org.jboss.logging</groupId>
    <artifactId>jboss-logging</artifactId>
    <version>3.2.1.Final</version>
</dependency>

Feito isso o nosso Hibernate 4 vai funcionar corretamente. Mas dependendo do cenário pode ser que seja necessário realizar outros ajustes, como no meu caso…

Meu cenário

Uma aplicação web rodando no Glassfish 4.1, neste caso o Glassfish utiliza uma implementação do Jboss Logging que é 3.1.3.GA que fica dentro do diretório modules do Glassfish. Dessa forma ao fazer o deploy ele carrega a versão 3.1.3.GA antes de carregar os jar que estão dentro do WEB-INF/lib da minha aplicação, dentre esses jars esta a versão atualizada do Jboss Logging 😦

Moral da história a versão atualizada não é utilizada, atualizar a versão que está dentro do diretório modules seria uma saída, eu disse seria, ao atualizar a versão o Glassfish apresenta um erro. Me parece que esse erro acontece por que existe alguma implementação tentando fazer um import que não existe no jar novo.

A minha solução foi adicionar um atributo no glassfish-web.xml que faz com que ele carregue primeiro as classes que estão dentro do WAR, dessa forma:

<class-loader delegate="false"/>

Ai sim tudo funciona normalmente!!!

O único ponto de atenção que se deve ter é quando esse WAR acessa outros módulos de fora do WAR, por exemplo, módulos de um projeto EAR. Nessa caso a aplicação web não vai funcionar e a única solução é: trocar de servidor ou utilizar a versão antiga do Log4j, a versão 1.2.

Referências:

http://wiki.apache.org/logging/Log4j2AndHibernate4

http://docs.jboss.org/hibernate/orm/4.3/topical/html/logging/Logging.html

https://issues.jboss.org/browse/JBLOGGING-94

Fui.

Esse post foi publicado em Desenvolvimento e marcado , , . Guardar link permanente.

Deixe um comentário