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键或者空格。
查看效果。
此时启动项目查看效果可以看到效果如下:

日志文件中的样式:

SpringDataJpa打印Sql详情(含参数)的更多相关文章
- Hibernate打印SQL及附加参数
今天在项目运行过程中,一直报一个org.hibernate.exception.GenericJDBCException: could not insert 异常,Root Cause是IBM DB ...
- hibernate打印sql日志及参数
#log4j.properties log4j.rootLogger=info, CA# ConsoleAppenderlog4j.appender.CA=org.apache.log4j.Conso ...
- hibernate 打印sql和参数的配置
1.配置spring-hiberbate.xml:<prop key="hibernate.show_sql">true</prop>--强制打印sql 不 ...
- jpa hibernate 打印sql,format日志,打印SQL参数,打印什么指令
环境说明:IntelliJ IDEA 2017.3.4 版本:SpringBoot 2.0.0.RELEASE:hibernate用的是JPA自带. 打印SQL 到控制台: 首先,我使用的是appli ...
- MyBatis 插件 : 打印 SQL 及其执行时间
Plugins 摘一段来自MyBatis官方文档的文字. MyBatis允许你在某一点拦截已映射语句执行的调用.默认情况下,MyBatis允许使用插件来拦截方法调用: Executor(update. ...
- mybatis 打印sql 语句
拦截器 package com.cares.asis.mybatis.interceptor; import java.text.DateFormat; import java.util.Date; ...
- mybatis 控制台打印sql
开发时调试使用 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBe ...
- spring集成mybatis后,打印SQL语句
网上说mybatis的早前版本配置打印sql还比较简单,在3.0.6之后配置方式修改了. 现在的spring-mybatis.xml配置如下: <bean id="sqlSession ...
- laravel5.5打印sql语句
额.其实laravel很不方便的地方就是sql写错之后不是很好调试. 上方法. //DB::connection()->enableQueryLog(); // 开启QueryLog//$rep ...
随机推荐
- mysql 语句中 sum函数求和 null 变 0
https://blog.csdn.net/Z_passionate/article/details/83821039
- SpringCloud创建Eureka模块集群
1.说明 本文详细介绍Spring Cloud创建Eureka模块集群的方法, 基于已经创建好的Spring Cloud Eureka Server模块, 请参考SpringCloud创建Eureka ...
- 【工具】Java转换exe
一.导出jar包 eclipse中对着要转换的项目,右键,导出 搜索jar,选择jar文件,下一步 选择要输出的项目 继续下一步 选择主程序 完成 二.下载及安装exe4j,并转换jar文件为exe文 ...
- Python升级至2.7方法
在Linux下Python升级至2.7的详细步骤方法, 此处的升级,使用的是全新安装新版本,替换旧版本的方法, 同时新旧版本可以共存,将默认python指向最新2.7版本即可. 1.下载Python- ...
- C# UTF8的BOM导致XML序列化与反序列化报错:Data at the root level is invalid. Line 1, position 1.
最近在写一个xml序列化及反序列化实现时碰到个问题,大致类似下面的代码: class Program { static void Main1(string[] args) { var test = n ...
- CF149D游戏
题目描述 Petya遇到了一个关于括号序列的问题: 给定一个字符串S,它代表着正确的括号序列,即("(")与 (")")是匹配的.例如:"(())() ...
- Python中切片方法总结
对字符串或列表使用切片方法进行操作时 对包含[-1]的方法的使用经常用错 其实[-1]即指最后一个元素(同理[-2]指倒数第二个元素) 现总结如下 以便加深记忆 >>> li = [ ...
- springboot 开启事务回滚
在数据库操作时如果发生异常,回滚的方法 在方法上添加注解@Transactional,作用域是方法级的 参考资料: https://www.cnblogs.com/c2g5201314/p/13163 ...
- Kotlin 协程一 —— 全面了解 Kotlin 协程
一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...
- leetcode 347. 前 K 个高频元素
问题描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums ...