从零开始 Spring Boot 59:Hibernate 日志
图源:简书 (jianshu.com)
Hibernate 支持多种日志模块,本文介绍如何在 Spring Boot 中使用 Log4j2记录 Hibernate 日志。
实际上本文是我在写上篇文章时遇到的各种坑和最终解决的记录。
首先需要添加 Log4j2 的依赖,并排除 Spring Boot 默认使用的 logging common 日志模块:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
在resources
目录下添加 Log4j2 的配置文件log4j2-spring.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="LOG_PATTERN">
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex
</Property>
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
</Appenders>
<Loggers>
<Logger name="com.example.manytomany" level="debug" additivity="false">
<AppenderRef ref="ConsoleAppender" />
</Logger>
<Logger name="org.hibernate.SQL" level="debug" additivity="false">
<AppenderRef ref="ConsoleAppender"/>
</Logger>
<Logger name="org.hibernate.orm.jdbc.bind" level="trace" additivity="false">
<AppenderRef ref="ConsoleAppender"/>
</Logger>
<Logger name="org.hibernate.stat" level="trace" additivity="false">
<AppenderRef ref="ConsoleAppender"/>
</Logger>
<Logger name="org.hibernate.SQL_SLOW" level="trace" additivity="false">
<AppenderRef ref="ConsoleAppender"/>
</Logger>
<Logger name="org.hibernate.cache" level="trace" additivity="false">
<AppenderRef ref="ConsoleAppender"/>
</Logger>
<Root level="info">
<AppenderRef ref="ConsoleAppender" />
</Root>
</Loggers>
</Configuration>
- 不需要在配置文件(
application.properties
)中显式指定配置,比如logging.config=xxx
。Spring Boot 可以自动检测并读取 Log4j2 的配置文件。- Log4j2 配置文件可以命名为
log4j2.xml
或log4j2-spring.xml
,但因为 Spring 的加载机制的原因,前者不会被正常加载,所以最好使用后者进行命名。
XML 中有两个节点比较重要:
Appenders
,定义日志输出的目标(Appender
),可以是控制台或者文件,示例中只设置了控制台。Loggers
,可以定义多个Logger
,每个Logger
可以控制某个包下的日志输出级别,以及输出到哪些地方(AppenderRef
)。对于没有特定Logger
的包,会使用Root
的设置输出日志。
示例中输出 Hibernate 日志的 Logger 设置适用于 Hibernate 6 以上版本。
现在这种设置可以可以让 Hibernate 日志输出到控制台。不过如果你使用 Spring Boot 的测试用例,并需要查看 Hibernate 日志,还需要注意,此时只能使用@SpringBootTest
标注的测试套件。如果使用@SpringJunitConfig
标注的测试套件就不会输出 Hibernate 日志,因为这种情况下不能正常加载相应的日志模块。
比如:
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@SpringBootTest
@Import(ExampleDataConfig.class)
@Transactional
public class StudentTests {
// ...
}
关于 Spring Boot 的测试框架的相关说明,可以阅读我的这篇文章。
现在输出的 Hibernate 日志中就包含 SQL 和相应参数的绑定信息:
... DEBUG ... : insert into student_course2 (rate,course_id,student_id) values (?,?,?)
... TRACE ... : binding parameter [1] as [INTEGER] - [88]
... TRACE ... : binding parameter [2] as [BIGINT] - [111]
... TRACE ... : binding parameter [3] as [BIGINT] - [82]
The End,谢谢阅读。
本文的完整示例代码可以从这里获取。
参考资料
- How to use Log4j 2 with Spring Boot | CalliCoder
- Log4j – Articles and Tutorials
- SpringBoot整合log4j2进行日志配置及防坑指南 - 星空流年 - 博客园 (cnblogs.com)
- Hibernate 4, 5 & 6的日志指南 - 在开发和生产中使用正确的配置 - 掘金 (juejin.cn)