红茶的个人站点

  • 首页
  • 专栏
  • 开发工具
  • 其它
  • 隐私政策
Awalon
Talk is cheap,show me the code.
  1. 首页
  2. 专栏
  3. Spring Boot 学习笔记
  4. 正文

从零开始 Spring Boot 59:Hibernate 日志

2023年7月4日 1035点热度 0人点赞 0条评论

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.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)

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: hibernate spring 日志
最后更新:2023年7月4日

魔芋红茶

加一点PHP,加一点Go,加一点Python......

点赞
< 上一篇
下一篇 >

文章评论

取消回复

*

code

COPYRIGHT © 2021 icexmoon.cn. ALL RIGHTS RESERVED.
本网站由提供CDN加速/云存储服务

Theme Kratos Made By Seaton Jiang

宁ICP备2021001508号

宁公网安备64040202000141号