Lấy cảm hứng từ bài đăng Hypoport của Leif , đây là cách tôi "bẻ cong" Hibernate 4 trở lại slf4j:
Giả sử bạn đang sử dụng Maven.
- Thêm
org.slf4j:log4j-over-slf4j
như một phụ thuộc vào của bạnpom.xml
- Sử dụng lệnh
mvn dependency:tree
, đảm bảo rằng không có tạo tác nào bạn đang sử dụng phụ thuộc vào slf4j:slf4j
(chính xác là không có tạo tác nào có phụ thuộc phạm vi biên dịch hoặc phụ thuộc phạm vi thời gian chạyslf4j:slf4j
)
Bối cảnh: Hibernate 4.x có phụ thuộc vào tạo tác org.jboss.logging:jboss-logging
. Transitively, hiện tượng này có cung cấp phụ thuộc phạm vi trên vật slf4j:slf4j
.
Vì bây giờ chúng ta đã thêm org.slf4j:log4j-over-slf4j
hiện vật, org.slf4j:log4j-over-slf4j
bắt chước slf4j:slf4j
tạo tác. Do đó, mọi thứ mà JBoss Logging
các bản ghi bây giờ sẽ thực sự đi qua slf4j.
Giả sử bạn đang sử dụng Logback làm chương trình phụ trợ ghi nhật ký của mình. Đây là một mẫupom.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>
Trên classpath của bạn, có một logback.xml
, chẳng hạn như cái này nằm trong 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 -->
Một số thành phần có thể muốn có quyền truy cập logback.xml
vào thời điểm khởi động JVM để ghi nhật ký thích hợp, chẳng hạn như Plugin Jetty Maven. Trong trường hợp đó, hãy thêm một hệ thống Java logback.configurationFile=./path/to/logback.xml
vào lệnh của bạn (ví dụ mvn -Dlogback.configurationFile=./target/classes/logback.xml jetty:run
).
Trong trường hợp bạn vẫn nhận được đầu ra "thô" của bảng điều khiển Stdout Hibernate (như Hibernate: select ...
), thì câu hỏi Stack Overflow " Tắt ghi nhật ký ngủ đông vào bảng điều khiển " có thể áp dụng.