Inspirado por la publicación de Hypoport de Leif , así es como "doblé" Hibernate 4 de nuevo a slf4j:
Supongamos que está utilizando Maven.
- Agregue
org.slf4j:log4j-over-slf4j
como dependencia a supom.xml
- Usando el comando
mvn dependency:tree
, asegúrese de que ninguno de los artefactos que está usando dependa slf4j: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 artefacto slf4j:slf4j
.
Como ahora hemos agregado el org.slf4j:log4j-over-slf4j
artefacto, org.slf4j:log4j-over-slf4j
imita el slf4j:slf4j
artefacto. Por lo tanto, todo lo que JBoss Logging
registre ahora irá a través de slf4j.
Digamos que está usando Logback como su backend de registro. Aquí hay una muestrapom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
....
<properties>
....
<slf4j-api-version>1.7.2</slf4j-api-version>
<log4j-over-slf4j-version>1.7.2</log4j-over-slf4j-version>
<jcl-over-slf4j-version>1.7.2</jcl-over-slf4j-version> <!-- no problem to have yet another slf4j bridge -->
<logback-core-version>1.0.7</logback-core-version>
<logback-classic-version>1.0.7</logback-classic-version>
<hibernate-entitymanager-version>4.1.7.Final</hibernate-entitymanager-version> <!-- our logging problem child -->
</properties>
<dependencies>
<!-- begin: logging-related artifacts .... -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-api-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${jcl-over-slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>${log4j-over-slf4j-version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback-core-version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback-classic-version}</version>
</dependency>
<!-- end: logging-related artifacts .... -->
<!-- begin: some artifact with direct dependency on log4j:log4j .... -->
<dependency>
<groupId>org.foo</groupId>
<artifactId>some-artifact-with-compile-or-runtime-scope-dependency-on-log4j:log4j</artifactId>
<version>${bla}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- begin: some artifact with direct dependency on log4j:log4j .... -->
<!-- begin: a hibernate 4.x problem child........... -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate-entitymanager-version}</version>
</dependencies>
<!-- end: a hibernate 4.x problem child........... -->
....
</project>
En su classpath, tenga un logback.xml
, como este, ubicado en src/main/java
:
<!-- begin: logback.xml -->
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.hibernate" level="debug"/>
<root level="info">
<appender-ref ref="console"/>
</root>
</configuration>
<!-- end: logback.xml -->
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 Java logback.configurationFile=./path/to/logback.xml
a su comando (por ejemplo mvn -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 ".