You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置使spring.jpa.show-sql生成的Hibernate SQL日志适配Log4j2格式

如何配置使spring.jpa.show-sql生成的Hibernate SQL日志适配Log4j2格式

嗨,我来帮你解决这个问题~ 其实spring.jpa.show-sql=true这个配置只是个简单的控制台打印开关,它的输出并没有走Log4j2的日志框架,所以才会和你其他日志格式不统一。要让Hibernate的SQL日志适配Log4j2的格式,咱们得换个方式配置:

第一步:关闭原生的show-sql配置

先把application.properties(或application.yml)里的配置改成这样,关掉直接打印的开关:

spring.jpa.show-sql=false
# 可选:如果之前开了format_sql也可以关掉,后续日志框架会帮我们处理格式
spring.jpa.properties.hibernate.format_sql=false

第二步:配置Log4j2捕获Hibernate的SQL日志

我们需要通过Log4j2来控制Hibernate的SQL相关日志类别,让它们走统一的日志格式。具体要配置两个核心日志类别:

  • org.hibernate.SQL:负责输出SQL语句本身,级别设为DEBUGINFO都可以
  • org.hibernate.type.descriptor.sql.BasicBinder:负责输出SQL语句的参数值,这个需要设为TRACE级别才会打印参数

如果你用的是Log4j2 XML配置(log4j2.xml)

在配置文件里添加以下Logger配置:

<!-- 输出SQL语句 -->
<Logger name="org.hibernate.SQL" level="DEBUG" additivity="false">
    <AppenderRef ref="ConsoleAppender"/> <!-- 这里替换成你项目中控制台Appender的名称 -->
</Logger>
<!-- 输出SQL参数(可选,如果不需要看参数可以去掉) -->
<Logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" additivity="false">
    <AppenderRef ref="ConsoleAppender"/> <!-- 同样替换成你的控制台Appender名称 -->
</Logger>

如果你用的是Log4j2 Properties配置(log4j2.properties)

添加以下配置:

# 配置SQL语句日志
logger.hibernate_sql.name = org.hibernate.SQL
logger.hibernate_sql.level = DEBUG
logger.hibernate_sql.additivity = false
logger.hibernate_sql.appenderRef.console.ref = ConsoleAppender

# 配置SQL参数日志(可选)
logger.hibernate_binder.name = org.hibernate.type.descriptor.sql.BasicBinder
logger.hibernate_binder.level = TRACE
logger.hibernate_binder.additivity = false
logger.hibernate_binder.appenderRef.console.ref = ConsoleAppender

效果说明

配置完成后,Hibernate的SQL日志就会和你其他Log4j2日志一样,带上时间、线程名称、日志级别等统一格式了。比如你之前的日志会变成类似这样的格式:

2024-04-20 16:02:01.031 | http-nio-9001-exec-1 | DEBUG | org.hibernate.SQL | | select nextval('id_account_seq')
2024-04-20 16:02:01.032 | http-nio-9001-exec-1 | TRACE | org.hibernate.type.descriptor.sql.BasicBinder | | binding parameter [1] as [VARCHAR] - [example@test.com]

如果不需要打印SQL参数,只保留org.hibernate.SQL的配置就行啦。

备注:内容来源于stack exchange,提问作者Paul Marcelin Bejan

火山引擎 最新活动