从零开始 Spring Boot 59:Hibernate 日志

文章介绍了如何在SpringBoot项目中使用Log4j2替代默认的日志模块来记录Hibernate的日志,包括添加依赖、配置Log4j2的XML文件,以及设置不同级别的日志输出,特别提到了测试用例中日志显示的注意事项。

从零开始 Spring Boot 59:Hibernate 日志

spring boot

图源:简书 (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.xmllog4j2-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,谢谢阅读。

本文的完整示例代码可以从这里获取。

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值