Hibernate 3.x utilizado slf4jpara la tala. Usos de Hibernate 4.xjboss-logging. Estoy escribiendo una aplicación independiente que usa Hibernate 4 y SLF4J para el registro.
¿Cómo puedo configurar Hibernate para iniciar sesión en SLF4J?
Si eso no es posible, ¿cómo puedo configurar el registro de Hibernate?
La sección del manual de Hibernate 4.1 sobre registro comienza con la advertencia de que es ...
Completamente desactualizado. Hibernate usa JBoss Logging a partir de 4.0. Esto se documentará a medida que migremos este contenido a la Guía para desarrolladores.
... continúa hablando de SLF4J, por lo que es inútil. Ni la guía de introducción ni la guía para desarrolladores hablan en absoluto sobre el registro. Tampoco la guía de migración .
He buscado documentación sobre jboss-logging, pero no he podido encontrar ninguna. La página de GitHub está en silencio , y la página de proyectos comunitarios de JBoss ni siquiera enumera jboss-logging. Me preguntaba si el rastreador de errores del proyecto podría tener algún problema relacionado con el suministro de documentación, pero no es así.
La buena noticia es que cuando utiliza Hibernate 4 dentro de un servidor de aplicaciones, como JBoss AS7, el registro se encarga en gran medida de usted. Pero, ¿cómo puedo configurarlo en una aplicación independiente?
fuente
Respuestas:
Mira https://github.com/jboss-logging/jboss-logging/blob/master/src/main/java/org/jboss/logging/LoggerProviders.java :
Así posibles valores de
org.jboss.logging.provider
son:jboss
,jdk
,log4j
,slf4j
.Si no lo configura
org.jboss.logging.provider
, intenta jboss, luego log4j, luego slf4j (solo si se usa logback) y retrocede a jdk.Yo uso
slf4j
conlogback-classic
:y todo funciona bien!
ACTUALIZACIÓN Algunos usuarios utilizan en App.java muy principal:
pero para las soluciones basadas en contenedores esto no funciona.
ACTUALIZACIÓN 2 Quienes piensan que gestionan Log4j con SLF4J porque
jboss-logging
no es exactamente así.jboss-logging
utiliza directamente Log4j sin SLF4J!fuente
org.jboss.logging.provider
?System.getProperty(LOGGING_PROVIDER_KEY);
que necesite, establecer la propiedad del sistema. A través dejava -D...=...
o consulte los documentos de su contenedor.Para que SLF4J funcione con JBoss Logging sin Logback como backend, se requiere el uso de una propiedad del sistema
org.jboss.logging.provider=slf4j
.log4j-over-slf4j
Las tácticas no parecen funcionar en este caso porque el registro volverá a JDK si ni Logback ni log4j no están presentes en classpath.Esto es un poco molesto y para que la autodetección funcione, debe ver que el cargador de clases contiene al menos
ch.qos.logback.classic.Logger
desde logback-classic oorg.apache.log4j.Hierarchy
desde log4j para engañar a JBoss Logging para que no recurra al registro JDK.La magia se interpreta en
org.jboss.logging.LoggerProviders
ACTUALIZACIÓN: Se ha agregado el soporte del cargador de servicios para que sea posible evitar problemas con la detección automática al declarar
META-INF/services/org.jboss.logging.LoggerProvider
(conorg.jboss.logging.Slf4jLoggerProvider
como valor). Parece que también se ha añadido soporte log4j2.fuente
-Dorg.jboss.logging.provider=slf4j
es suficiente. LoggingProviders.java le brinda una mejor información sobre cuáles son los valores aceptados actuales y qué se espera que esté presente en la ruta de clases.Slf4jLoggerProvider
no es unapublic
clase.Inspirado por la publicación de Hypoport de Leif , así es como "doblé" Hibernate 4 de nuevo a slf4j:
Supongamos que está utilizando Maven.
org.slf4j:log4j-over-slf4j
como dependencia a supom.xml
mvn dependency:tree
, asegúrese de que ninguno de los artefactos que está usando dependaslf4j:slf4j
(para ser precisos, ningún artefacto tendrá una dependencia del alcance de compilación o una dependencia del alcance del tiempo de ejecuciónslf4j:slf4j
)Antecedentes: Hibernate 4.x depende del artefacto
org.jboss.logging:jboss-logging
. De manera transitiva, este artefacto tiene una dependencia de alcance proporcionada en el artefactoslf4j:slf4j
.Como ahora hemos agregado el
org.slf4j:log4j-over-slf4j
artefacto,org.slf4j:log4j-over-slf4j
imita elslf4j:slf4j
artefacto. Por lo tanto, todo lo queJBoss Logging
registre ahora irá a través de slf4j.Digamos que está usando Logback como su backend de registro. Aquí hay una muestra
pom.xml
En su classpath, tenga un
logback.xml
, como este, ubicado ensrc/main/java
:Es posible que algunos componentes quieran tener acceso
logback.xml
en el momento de inicio de la JVM para un registro adecuado, por ejemplo, el complemento Jetty Maven. En ese caso, agregue un sistema Javalogback.configurationFile=./path/to/logback.xml
a su comando (por ejemplomvn -Dlogback.configurationFile=./target/classes/logback.xml jetty:run
).En caso de que siga obteniendo la salida estándar de la consola "sin procesar ", puede aplicarse la
Hibernate: select ...
pregunta de desbordamiento de pila " Desactivar el registro de hibernación en la consola ".fuente
org.jboss.logging.provider=slf4j
Primero se da cuenta de que SLF4J no es un derecho de biblioteca de registro, es un contenedor de registro. Por sí mismo no registra nada, simplemente delega a "backends".
Para "configurar" jboss-logging, simplemente agregue cualquier marco de registro que desee usar en su classpath (junto con jboss-logging) y jboss-logging calcula el resto.
Creé una guía centrada en Hibernate para la configuración de JBoss Logging: http://docs.jboss.org/hibernate/orm/4.3/topical/html/logging/Logging.html
fuente
org.jboss.logging.provider
propiedad del sistema.Estoy usando Hibernate Core 4.1.7.Final más Spring 3.1.2.RELEASE en una aplicación independiente. Agregué Log4j 1.2.17 a mis dependencias y parece que, como JBoss Logging registra directamente en log4j si está disponible y Spring usa Commons Logging, que también usa Log4j si está disponible, todos los registros se pueden configurar a través de Log4J.
Aquí está mi lista de dependencias relevantes:
fuente
así que lo hice funcionar en mi proyecto. hibernate 4, slf4j, logback. mi proyecto es gradle, pero debería ser el mismo para maven.
Básicamente, Abdull tiene razón. Donde NO tiene razón, es que NO tiene que eliminar slf4j de las dependencias.
incluir para compilar el alcance:
org.slf4j: slf4j-api
org.slf4j: log4j-over-slf4j
por ejemplo, para logback (ch.qos.logback: logback-classic, ch.qos.logback: logback-core: 1.0.12)
excluir completamente las bibliotecas log4j de las dependencias
resultado: hibernar registros a través de slf4j para iniciar sesión. por supuesto, debería poder usar una implementación de registro diferente a la de logback
para asegurarse de que no haya log4j, verifique sus bibliotecas en classpath o web-inf / lib para ver los archivos war.
por supuesto, ha configurado los registradores en logback.xml, por ejemplo:
<logger name="org.hibernate.SQL" level="TRACE"/>
fuente
Hibernate 4.3 tiene cierta documentación sobre cómo controlar
org.jboss.logging
:Busca en la ruta de clases un proveedor de registro . Busca slf4j después de buscar log4j. Entonces, en teoría, asegurarse de que su classpath (WAR) no incluya log4j y sí incluya la API slf4j y un back-end debería funcionar.
Como último recurso, puede establecer la
org.jboss.logging.provider
propiedad del sistema enslf4j
.A pesar de las afirmaciones de la documentación,
org.jboss.logging
insistí en intentar usar log4j, a pesar de que log4j estaba ausente y SLF4J estaba presente, lo que resultó en el siguiente mensaje en mi archivo de registro de Tomcat (/var/log/tomcat/catalina.out
):Tuve que seguir la sugerencia de la respuesta por dasAnderl ausMinga e incluir el
log4j-over-slf4j
puente.fuente
Utilizo maven y agregué la siguiente dependencia:
Luego, creé
log4j.properties
archivos en/src/main/resources
:Esto lo pondrá en la raíz de su
.jar
. Funciona a las mil maravillas...fuente
Tuve un problema al hacer que el registro de hibernate 4 funcionara con weblogic 12c y log4j. La solución es poner lo siguiente en su weblogic-application.xml:
fuente
A cualquiera que pudiera enfrentar el mismo problema que yo tuve. En caso de que haya probado todas las otras soluciones explicadas aquí y aún no vea que el registro de hibernación funcione con su slf4j, podría deberse a que está utilizando un contenedor que tiene en sus bibliotecas de carpetas el jboss-logging.jar. Esto significa que se carga previamente antes de que pueda establecer cualquier configuración para influir en él. Para evitar este problema en weblogic puede especificar en el archivo weblogic-application.xml en su oído / META-INF para preferir la biblioteca cargada desde la aplicación. Debería haber un mecanismo similar para otros contenedores de servidor. En mi caso tuve que agregar:
fuente
intentaste esto:
- slf4j-log4j12.jar en el caso de Log4J. Consulte la documentación de SLF4J para obtener más detalles. Para utilizar Log4j, también deberá colocar un archivo log4j.properties en su classpath. Un archivo de propiedades de ejemplo se distribuye con Hibernate en el directorio src /
simplemente agregue estos frascos y propiedades o log4j xml en el classpath
fuente