如何配置Hibernate 6.1.2使用JDK日志提供器?
解决Hibernate 6.1.2使用JDK日志的配置问题
核心问题原因
你遇到的SLF4J错误,是因为Hibernate依赖的JBoss Logging初始化时,要么你的系统属性设置时机过晚,要么间接引入的SLF4J API触发了默认逻辑,导致org.jboss.logging.provider=jdk未生效,最终JBoss Logging尝试 fallback到SLF4J。
正确配置方法
1. 确保系统属性设置时机足够早
代码中设置属性必须放在所有Hibernate/JBoss Logging类加载之前,比如main方法的最开头,避免提前触发类加载导致配置失效:
public class TestSL4JBug { public static void main(String[] args) { // 必须放在第一行,保证在Hibernate类加载前生效 System.setProperty("org.jboss.logging.provider", "jdk"); jakarta.persistence.Persistence.createEntityManagerFactory("myPersistence"); } }
如果代码设置仍无效,改用JVM启动参数配置,这是优先级最高的方式,能确保在应用启动时就生效:
-Dorg.jboss.logging.provider=jdk
2. 使用JBoss Logging配置文件
在类路径下创建jboss-logging.properties文件,添加以下内容:
org.jboss.logging.provider=jdk
这种方式无需修改代码,配置文件会被JBoss Logging自动读取,优先级低于JVM启动参数,但高于代码中设置的系统属性。
3. 排除不必要的SLF4J依赖(可选)
如果项目依赖树中存在slf4j-api(比如通过其他框架间接引入),可以在构建工具中排除它,避免触发SLF4J相关逻辑。以Maven为例:
<dependencies> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-core</artifactId> <version>6.1.2.Final</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
关键说明
org.jboss.logging.provider属性在Hibernate 6中并未变更,仍然有效,核心是要确保配置在JBoss Logging初始化前被读取。- 无需添加任何SLF4J相关依赖,配置生效后,JBoss Logging会直接使用JDK自带的
java.util.logging(JUL)作为日志提供器。
内容的提问来源于stack exchange,提问作者Tim Lammarsch
相关产品推荐
相关产品推荐

