You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring应用Hibernate SQL日志未接入Logback/Logstash Appender且无参数值

问题描述

我有一个Java Spring应用,在application.properties中配置了:

spring.jpa.hibernate.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.show_sql=true

使用logback/logstash处理所有日志,但Hibernate日志未进入指定的json appender,且仅显示SQL占位符?,不显示实际参数值。

当前logback.xml中相关配置:

<logger name="org.hibernate.type" level="TRACE">
    <appender-ref ref="json" />
</logger>

json appender配置:

<appender name="json" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <timestampPattern>yyyy-MM-dd'T'HH:mm:ss.SSSZ</timestampPattern>
        <includeMdcKeyName>RID</includeMdcKeyName>
        <mdcKeyFieldName>RID=rid</mdcKeyFieldName>
        <fieldNames>
            <timestamp>timestamp</timestamp>
            <level>level</level>
            <levelValue>[ignore]</levelValue>
            <logger>logger</logger>
            <version>[ignore]</version>
        </fieldNames>
    </encoder>
</appender>

正常日志格式(真实内容已用{...}替换):

{"timestamp":"2023-04-20T16:11:25.133-0600","message":"My normal log message","logger":"{...}","thread_name":"{...}","level":"INFO","rid":"{...}"}

但Hibernate日志仍为:

Hibernate: SELECT * FROM my_table mt WHERE mt.name = ?

期望Hibernate日志格式与正常日志一致,同时显示SQL实际参数值。

解决方案

1. 让Hibernate日志进入logback的json appender

hibernate.show_sql=true是直接将SQL打印到控制台,不走日志框架,所以需要关闭该配置,改用日志框架控制输出:

  • 修改application.properties:
    # 关闭直接打印SQL到控制台
    spring.jpa.properties.hibernate.show_sql=false
    # 开启Hibernate通过日志框架输出SQL
    spring.jpa.properties.hibernate.use_sql_comments=true
    
  • 在logback.xml中添加针对org.hibernate.SQL的logger配置,关联json appender:
    <logger name="org.hibernate.SQL" level="DEBUG" additivity="false">
        <appender-ref ref="json" />
    </logger>
    

    注:设置additivity="false"可避免日志被重复输出到其他默认appender。

2. 显示SQL实际参数值

要输出参数实际值,需开启org.hibernate.type.descriptor.sql的TRACE级别日志:

  • 在logback.xml中添加配置:
    <logger name="org.hibernate.type.descriptor.sql" level="TRACE" additivity="false">
        <appender-ref ref="json" />
    </logger>
    
    该配置会输出SQL参数的具体值,与org.hibernate.SQL的日志配合,可完整查看带参数的SQL执行信息。

3. 最终配置验证

修改后的application.properties关键配置:

spring.jpa.hibernate.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.show_sql=false
spring.jpa.properties.hibernate.use_sql_comments=true

修改后的logback.xml相关logger配置:

<logger name="org.hibernate.SQL" level="DEBUG" additivity="false">
    <appender-ref ref="json" />
</logger>
<logger name="org.hibernate.type.descriptor.sql" level="TRACE" additivity="false">
    <appender-ref ref="json" />
</logger>

完成配置后,Hibernate的SQL日志会通过json appender输出为指定的JSON格式,同时参数值也会被打印出来。

内容的提问来源于stack exchange,提问作者Ebad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:45:31