受Leif的Hypoport博客文章启发,以下是我如何将Hibernate 4“弯曲”回到slf4j:
假设您正在使用Maven。
- 在您的
pom.xml
中添加org.slf4j:log4j-over-slf4j
依赖项
- 使用命令
mvn dependency:tree
,确保您使用的任何工件都不依赖于slf4j:slf4j
(准确来说,没有工件应该有一个编译范围的依赖关系或运行时范围的依赖关系slf4j:slf4j
)
背景:Hibernate 4.x依赖于工件org.jboss.logging:jboss-logging
。 因此,在传递依赖项中,这个工件对工件slf4j:slf4j
具有提供范围的依赖关系。
现在,我们已经添加了org.slf4j:log4j-over-slf4j
工件,org.slf4j:log4j-over-slf4j
模仿slf4j:slf4j
工件。因此,所有JBoss Logging
记录的内容现在实际上将通过slf4j进行。
假设您正在使用Logback作为日志记录后端。以下是一个示例pom.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>
<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>
</properties>
<dependencies>
<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>
<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>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate-entitymanager-version}</version>
</dependencies>
....
</project>
在你的类路径中,有一个名为 logback.xml
的文件,比如位于 src/main/java
中的这个:
<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>
有些组件可能需要在JVM启动时访问logback.xml
以进行适当的记录,例如Jetty Maven插件。此时,将Java系统logback.configurationFile=./path/to/logback.xml
添加到您的命令中(例如mvn -Dlogback.configurationFile=./target/classes/logback.xml jetty:run
)。
如果您仍然在控制台上获得“原始”控制台stdout Hibernate输出(例如Hibernate: select ...
),则Stack Overflow问题“关闭Hibernate日志记录到控制台”可能适用。