如何在IntelliJ IDEA中屏蔽Hibernate日志信息?
我来帮你搞定这个Hibernate INFO日志关不掉的麻烦——你试过的那些persistence.xml配置没生效,主要原因是这些配置要么对应了错误的日志框架,要么Hibernate的日志控制逻辑本来就不是靠persistence.xml里的这些属性来实现的。下面分情况给你具体的解决方案:
第一步:先搞清楚项目用的是哪种日志框架
Hibernate会自动适配不同的日志实现,先确认你的项目依赖里有没有这些包:
- Java Util Logging(JUL):JDK默认自带,无额外依赖包
- Log4j2:依赖
log4j-core、log4j-api - SLF4J + Logback:依赖
slf4j-api、logback-classic
第二步:针对不同日志框架的配置方法
情况1:用的是Java Util Logging(Hibernate默认)
如果是JUL,persistence.xml里的配置基本没用,得单独创建logging.properties文件放在src/main/resources下:
# 全局关闭Hibernate的INFO及以下日志 org.hibernate.level=SEVERE # 精准控制你提到的LogHelper类日志 org.hibernate.jpa.internal.util.LogHelper.level=SEVERE # 根日志级别如果需要也可以调严 .level=SEVERE
然后要确保JVM启动时加载这个配置,比如加启动参数:-Djava.util.logging.config.file=src/main/resources/logging.properties
如果是Web项目(比如Tomcat),也可以修改容器的logging.properties,但项目自定义的配置优先级更高。
情况2:用的是Log4j2
如果项目用Log4j2,得写log4j2.xml(或log4j2.properties)配置文件,persistence.xml里的log4j属性完全没用:
<Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <!-- 关闭Hibernate所有INFO及以下日志 --> <Logger name="org.hibernate" level="ERROR" additivity="false"> <AppenderRef ref="Console"/> </Logger> <!-- 单独控制LogHelper类的日志级别 --> <Logger name="org.hibernate.jpa.internal.util.LogHelper" level="ERROR" additivity="false"> <AppenderRef ref="Console"/> </Logger> <Root level="ERROR"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
情况3:用的是SLF4J + Logback
如果是SLF4J搭配Logback,创建logback.xml放在src/main/resources下:
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 禁用Hibernate的INFO日志 --> <logger name="org.hibernate" level="ERROR"/> <!-- 单独控制LogHelper类 --> <logger name="org.hibernate.jpa.internal.util.LogHelper" level="ERROR"/> <root level="ERROR"> <appender-ref ref="STDOUT"/> </root> </configuration>
为什么你之前的配置没用?
你试的那些属性,比如log4j.logger.org.hibernate只对旧版Log4j 1.x有效,现在基本没人用了;而org.hibernate.logging.level这类属性根本不是Hibernate官方支持的配置项——Hibernate的日志是完全委托给底层日志框架的,所以必须针对你实际用的框架来配置,不能在persistence.xml里瞎试这些无效属性。
另外要注意:Hibernate的核心启动日志(比如Version类输出的HHH000412)可能在persistence.xml加载之前就已经打印了,这时候一定要确保日志配置在Hibernate初始化之前就被加载生效,比如通过JVM参数提前指定日志配置文件。
内容的提问来源于stack exchange,提问作者Сергій Катрюк

