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配置,关联jsonappender:<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中添加配置:
该配置会输出SQL参数的具体值,与<logger name="org.hibernate.type.descriptor.sql" level="TRACE" additivity="false"> <appender-ref ref="json" /> </logger>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
相关产品推荐
相关产品推荐

