SpringDataJpa打印Sql详情(含参数)
Spring Data Jpa打印Sql详情(带sql参数)
这里使用的是 log4jdbc,yml配置文件里的数据源配置也要做相应的修改
pom文件引入
<dependency>
<groupId>com.googlecode.log4jdbc</groupId>
<artifactId>log4jdbc</artifactId>
<version>1.2</version>
</dependency>
修改yml配置文件
spring:
datasource:
url: jdbc:log4jdbc:mysql://xxxxxxxxxxxxxxxxxxxxxx
username: root
password: 123456
driver-class-name: net.sf.log4jdbc.DriverSpy
这里一共需要改两个地方,一个是driver-class-name,一个是url,要改成对应的log4j的。
添加配置文件log4jdbc.log4j2.properties
在项目resources目录下新建一个log4jdbc.log4j2.properties文件,内容如下
# If you use SLF4J. First, you need to tell log4jdbc-log4j2 that you want to use the SLF4J logger
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
这个时候已经可以启动项目查看效果了,这个时候没有截图,没法展示效果,简单描述下。
启动项目后我们能看到对应的完整Sql,包括参数,但是包含了很多我们不想看到的内容。
log4jdbc的log内容基本都包含在audit,resultsettable,connection,sqltiming,sqlonly这几个包下,所以我们需要对这几个包的log做一些处理;并且在实际项目中我们也需要对系统的log做一个保存,这时我们需要添加logback的配置文件。
添加logback配置
-
logback-base.xml
在resources目录下新建logback目录,并在里面新建logback-base.xml文件,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <included> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <jmxConfigurator/> <property name="LOG_FILE" value="/aplog/prod"/> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 --> <property name="LOG_HOME" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-./tmp}}/}}"/> <!-- 最大保存历史日志天数 --> <property name="LOG_MAX_HISTORY" value="30"/> <property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(TRACE_ID: [%X{TRACE_ID}]){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" /> <!-- value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %X{REQ_ID} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>--> <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} TRACE_ID: [%X{TRACE_ID}] ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!--<withJansi>true</withJansi>--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender> <!-- 消息日志,记录项目所有消息记录 --> <appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 如果指定了file属性,当天的文件名为file属性值 --> <file>${LOG_HOME}/info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件输出的文件名 --> <FileNamePattern>${LOG_HOME}/info.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern> <maxHistory>${LOG_MAX_HISTORY}</maxHistory> <maxFileSize>200MB</maxFileSize> <totalSizeCap>8GB</totalSizeCap> </rollingPolicy> <encoder> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>${FILE_LOG_PATTERN}</pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> </appender> <!-- 消息日志,记录项目所有消息记录 --> <appender name="warnLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 如果指定了file属性,当天的文件名为file属性值 --> <file>${LOG_HOME}/warn.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件输出的文件名 --> <FileNamePattern>${LOG_HOME}/warn.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern> <maxHistory>${LOG_MAX_HISTORY}</maxHistory> <maxFileSize>200MB</maxFileSize> <totalSizeCap>3GB</totalSizeCap> </rollingPolicy> <encoder> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>${FILE_LOG_PATTERN}</pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level><!-- 只接收错误级别的日志 --> </filter> </appender> <!-- 错误日志,记录项目标识的错误级别信息 --> <appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/error.log.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxHistory>${LOG_MAX_HISTORY}</maxHistory> <maxFileSize>100MB</maxFileSize> <totalSizeCap>2GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> </appender> <!-- 消息日志,记录项目所有消息记录 --> <appender name="debugLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 如果指定了file属性,当天的文件名为file属性值 --> <file>${LOG_HOME}/debug.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件输出的文件名 --> <FileNamePattern>${LOG_HOME}/debug.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern> <maxHistory>${LOG_MAX_HISTORY}</maxHistory> <maxFileSize>400MB</maxFileSize> <totalSizeCap>5GB</totalSizeCap> </rollingPolicy> <encoder> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>${FILE_LOG_PATTERN}</pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender> </included>
这里配置了四个等级的日志DEBUG, INFO,ERROR,WARN,包括日志文件的格式和控制台打印的格式。
-
logback各个环境的配置文件
在创建了logback-base.xml配置文件后,实际项目中,我们需要在不同的环境打印不同的log,这个时候我们需要在logback-base.xml同目录下创建对应的配置文件;例如logback-test.xml,测试环境配置文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="true"> <include resource="logback/logback-base.xml"/> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="STDOUT"/> <appender-ref ref="errorLog"/> <appender-ref ref="warnLog"/> <appender-ref ref="infoLog"/> <appender-ref ref="debugLog"/> </root> <logger name="jdbc.sqlonly" level="OFF" /> <logger name="jdbc.audit" level="OFF" /> <logger name="jdbc.resultsettable" level="OFF" /> <logger name="jdbc.connection" level="INFO" /> <logger name="jdbc.sqltiming" level="INFO" /> </configuration>
在这里呢我们在include了base配置的基础上,添加了另一些配置,就是那几行logger标签,对log4jdbc的日志做了些过滤,只保留了connection和sqltiming包下的log。
-
修改yml配置文件。
这个时候我们需要在系统yml配置文件中添加上两行引用我们刚刚写的配置文件。
logging: config: classpath:logback/logback-test.xml
这里要注意的是,logging是一级,前面不要用tab键或者空格。
查看效果
此时启动项目查看效果可以看到效果如下:
日志文件中的样式:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律