You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:40:34