Hibernate 3.x usado slf4jpara registro. Hibernate 4.x usajboss-logging. Estou escrevendo um aplicativo autônomo que usa Hibernate 4 e SLF4J para registro.
Como posso configurar o Hibernate para fazer logon no SLF4J?
Se isso não for possível, como posso configurar o log do Hibernate?
A seção do manual do Hibernate 4.1 sobre registro começa com o aviso de que é ...
Totalmente desatualizado. O Hibernate usa o JBoss Logging a partir do 4.0. Isso será documentado à medida que migrarmos este conteúdo para o Guia do desenvolvedor.
... passa a falar sobre SLF4J, e por isso é inútil. Nem o guia de primeiros passos nem o guia do desenvolvedor falam sobre registro. Nem o guia de migração .
Procurei documentação sobre o próprio jboss-logging, mas não consegui encontrar nenhuma. A página do GitHub é silenciosa e a página de projetos da comunidade do JBoss nem mesmo lista o jboss-logging. Gostaria de saber se o rastreador de bugs do projeto pode ter problemas relacionados ao fornecimento de documentação, mas não tem.
A boa notícia é que, ao usar o Hibernate 4 dentro de um servidor de aplicativos, como o JBoss AS7, o registro é feito para você. Mas como posso configurá-lo em um aplicativo autônomo?
fonte
Respostas:
Procure https://github.com/jboss-logging/jboss-logging/blob/master/src/main/java/org/jboss/logging/LoggerProviders.java :
Então possíveis valores para
org.jboss.logging.provider
são:jboss
,jdk
,log4j
,slf4j
.Se você não definir,
org.jboss.logging.provider
ele tenta jboss, então log4j, então slf4j (somente se logback for usado) e fallback para jdk.Eu uso
slf4j
comlogback-classic
:e tudo funciona bem!
ATUALIZAÇÃO Alguns usuários usam no App.java principal:
mas para soluções baseadas em contêiner, isso não funciona.
ATUALIZAÇÃO 2 Quem pensa que gerencia o Log4j com SLF4J para
jboss-logging
ele não é exatamente assim.jboss-logging
usa diretamente Log4j sem SLF4J!fonte
org.jboss.logging.provider
?System.getProperty(LOGGING_PROVIDER_KEY);
você precisa definir a propriedade do sistema. Por meiojava -D...=...
ou verifique os documentos do seu contêiner.Para fazer o SLF4J funcionar com o JBoss Logging sem o Logback como backend, é necessário o uso de uma propriedade do sistema
org.jboss.logging.provider=slf4j
.log4j-over-slf4j
as táticas não parecem estar funcionando neste caso, porque o registro retornará ao JDK se nem o Logback nem o log4j estiverem realmente presentes no classpath.Isso é um pouco incômodo e para fazer a autodetecção funcionar, você viu que o classloader contém pelo menos
ch.qos.logback.classic.Logger
from logback-classic ouorg.apache.log4j.Hierarchy
de log4j para enganar o JBoss Logging de não retroceder para o log do JDK.A magia é interpretada em
org.jboss.logging.LoggerProviders
ATUALIZAÇÃO: Foi adicionado suporte ao carregador de serviço para que seja possível evitar problemas com autodetecção declarando
META-INF/services/org.jboss.logging.LoggerProvider
(comorg.jboss.logging.Slf4jLoggerProvider
como um valor). Parece haver adicionado suporte log4j2 também.fonte
-Dorg.jboss.logging.provider=slf4j
é suficiente. LoggingProviders.java oferece melhores percepções sobre quais são os valores aceitos atualmente e o que se espera que esteja presente no caminho de classe.Slf4jLoggerProvider
não é umapublic
classe?Inspirado na postagem do Hypoport de Leif , é assim que "dobrei" o Hibernate 4 de volta ao slf4j:
Vamos supor que você esteja usando o Maven.
org.slf4j:log4j-over-slf4j
como uma dependência ao seupom.xml
mvn dependency:tree
, certifique-se de que nenhum dos artefatos que você está usando dependeslf4j:slf4j
(para ser preciso, nenhum artefato deve ter uma compilação dependência de escopo de ou dependência de escopo de tempo de execuçãoslf4j:slf4j
)Histórico: o Hibernate 4.x depende do artefato
org.jboss.logging:jboss-logging
. Transitivamente, esse artefato tem uma dependência de escopo fornecida no artefatoslf4j:slf4j
.Como agora adicionamos o
org.slf4j:log4j-over-slf4j
artefato, eleorg.slf4j:log4j-over-slf4j
imita oslf4j:slf4j
artefato. Portanto, tudo o queJBoss Logging
registra agora irá, na verdade, via slf4j.Digamos que você esteja usando Logback como back-end de registro. Aqui está um exemplo
pom.xml
Em seu classpath, tenha um
logback.xml
, como este localizado emsrc/main/java
:Alguns componentes podem querer ter acesso a
logback.xml
no momento da inicialização da JVM para o registro adequado, por exemplo, o plug-in Jetty Maven. Nesse caso, adicione um sistema Javalogback.configurationFile=./path/to/logback.xml
ao seu comando (por exemplomvn -Dlogback.configurationFile=./target/classes/logback.xml jetty:run
).No caso de você ainda estar obtendo uma saída "bruta" do console stdout do Hibernate (como
Hibernate: select ...
), então a pergunta do Stack Overflow " Desligue o registro de hibernação no console " pode ser aplicada.fonte
org.jboss.logging.provider=slf4j
Primeiro você percebe que SLF4J não é uma biblioteca de log, é um wrapper de log. Ele próprio não registra nada, ele simplesmente delega para "back-ends".
Para "configurar" o jboss-logging, você apenas adiciona qualquer estrutura de log que deseja usar em seu classpath (junto com o jboss-logging) e o jboss-logging descobre o resto.
Eu criei um guia focado no Hibernate para a configuração do JBoss Logging: http://docs.jboss.org/hibernate/orm/4.3/topical/html/logging/Logging.html
fonte
org.jboss.logging.provider
propriedade do sistema.Estou usando o Hibernate Core 4.1.7.Final mais Spring 3.1.2.RELEASE em um aplicativo independente. Eu adicionei Log4j 1.2.17 às minhas dependências e parece que, como o JBoss Logging registra diretamente no log4j se disponível e Spring usa Commons Logging, que também usa Log4j se disponível, todo o Logging pode ser configurado via Log4J.
Esta é minha lista de dependências relevantes:
fonte
então, acabei de fazê-lo funcionar no meu projeto. hibernar 4, slf4j, logback. meu projeto é gradle, mas deve ser o mesmo para o maven.
Basicamente, Abdull está certo. Onde ele NÃO está certo, é que você NÃO tem que remover slf4j das dependências.
inclua para compilar o escopo:
org.slf4j: slf4j-api
org.slf4j: log4j-over-slf4j
por exemplo, para logback (ch.qos.logback: logback-classic, ch.qos.logback: logback-core: 1.0.12)
excluir completamente as bibliotecas log4j das dependências
resultado: hibernar logs via slf4j para logback. claro que você deve ser capaz de usar uma implementação de log diferente de logback
para ter certeza de que nenhum log4j está presente, verifique sua biblioteca em classpath ou web-inf / lib para arquivos war.
é claro que você configurou os registradores em logback.xml, por exemplo:
<logger name="org.hibernate.SQL" level="TRACE"/>
fonte
O Hibernate 4.3 tem alguma documentação sobre como controlar
org.jboss.logging
:Ele pesquisa o caminho da classe para um provedor de registro . Ele pesquisa slf4j após pesquisar log4j. Portanto, em teoria, garantir que seu classpath (WAR) não inclua log4j e inclua a API slf4j e um back-end deve funcionar.
Como último recurso, você pode definir a
org.jboss.logging.provider
propriedade do sistema comoslf4j
.Apesar das reclamações da documentação,
org.jboss.logging
insistiu em tentar usar log4j, apesar de log4j estar ausente e SLF4J estar presente, resultando na seguinte mensagem em meu arquivo de log do Tomcat (/var/log/tomcat/catalina.out
):Tive que seguir a sugestão da resposta de dasAnderl ausMinga e incluir a
log4j-over-slf4j
ponte.fonte
Eu uso o maven e adicionei a seguinte dependência:
Então, criei um
log4j.properties
arquivo em/src/main/resources
:Isso vai colocá-lo na raiz do seu
.jar
. Ele funciona como um encanto...fonte
Tive um problema para fazer o registro do hibernate 4 funcionar com o weblogic 12c e o log4j. A solução é colocar o seguinte em seu weblogic-application.xml:
fonte
Para qualquer pessoa que pudesse enfrentar o mesmo problema que eu tive. Caso você tenha tentado todas as outras soluções explicadas aqui e ainda não veja o registro de hibernação funcionando com seu slf4j, pode ser porque você está usando um contêiner que tem em suas bibliotecas de pastas o jboss-logging.jar. Isso significa que ele é pré-carregado antes mesmo de você definir qualquer configuração para influenciá-lo. Para evitar este problema no weblogic você pode especificar no arquivo weblogic-application.xml em seu ear / META-INF para preferir a biblioteca carregada do aplicativo. deve haver um mecanismo semelhante para outros recipientes de servidor. No meu caso, tive que adicionar:
fonte
você tentou isto:
- slf4j-log4j12.jar no caso de Log4J. Consulte a documentação do SLF4J para obter mais detalhes. Para usar o Log4j, você também precisará colocar um arquivo log4j.properties em seu classpath. Um exemplo de arquivo de propriedades é distribuído com o Hibernate no diretório src /
basta adicionar esses jars e propriedades ou log4j xml no classpath
fonte