Spring Data Jpa打印Sql详情(带sql参数)

这里使用的是 log4jdbc,yml配置文件里的数据源配置也要做相应的修改

pom文件引入

  1. <dependency>
  2. <groupId>com.googlecode.log4jdbc</groupId>
  3. <artifactId>log4jdbc</artifactId>
  4. <version>1.2</version>
  5. </dependency>

修改yml配置文件

  1. spring:
  2. datasource:
  3. url: jdbc:log4jdbc:mysql://xxxxxxxxxxxxxxxxxxxxxx
  4. username: root
  5. password: 123456
  6. driver-class-name: net.sf.log4jdbc.DriverSpy

这里一共需要改两个地方,一个是driver-class-name,一个是url,要改成对应的log4j的。

添加配置文件log4jdbc.log4j2.properties

在项目resources目录下新建一个log4jdbc.log4j2.properties文件,内容如下

  1. # If you use SLF4J. First, you need to tell log4jdbc-log4j2 that you want to use the SLF4J logger
  2. log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

这个时候已经可以启动项目查看效果了,这个时候没有截图,没法展示效果,简单描述下。

启动项目后我们能看到对应的完整Sql,包括参数,但是包含了很多我们不想看到的内容。

log4jdbc的log内容基本都包含在audit,resultsettable,connection,sqltiming,sqlonly这几个包下,所以我们需要对这几个包的log做一些处理;并且在实际项目中我们也需要对系统的log做一个保存,这时我们需要添加logback的配置文件。

添加logback配置

  1. logback-base.xml

    在resources目录下新建logback目录,并在里面新建logback-base.xml文件,文件内容如下:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <included>
    3. <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    4. <jmxConfigurator/>
    5. <property name="LOG_FILE" value="/aplog/prod"/>
    6. <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
    7. <property name="LOG_HOME" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-./tmp}}/}}"/>
    8. <!-- 最大保存历史日志天数 -->
    9. <property name="LOG_MAX_HISTORY" value="30"/>
    10. <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}" />
    11. <!-- 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}}"/>-->
    12. <property name="FILE_LOG_PATTERN"
    13. 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}"/>
    14. <!-- 控制台输出 -->
    15. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    16. <!--<withJansi>true</withJansi>-->
    17. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    18. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
    19. <pattern>${CONSOLE_LOG_PATTERN}</pattern>
    20. <!-- 设置字符集 -->
    21. <charset>UTF-8</charset>
    22. </encoder>
    23. </appender>
    24. <!-- 消息日志,记录项目所有消息记录 -->
    25. <appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
    26. <!-- 如果指定了file属性,当天的文件名为file属性值 -->
    27. <file>${LOG_HOME}/info.log</file>
    28. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    29. <!--日志文件输出的文件名 -->
    30. <FileNamePattern>${LOG_HOME}/info.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
    31. <maxHistory>${LOG_MAX_HISTORY}</maxHistory>
    32. <maxFileSize>200MB</maxFileSize>
    33. <totalSizeCap>8GB</totalSizeCap>
    34. </rollingPolicy>
    35. <encoder>
    36. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
    37. <pattern>${FILE_LOG_PATTERN}</pattern>
    38. <!-- 设置字符集 -->
    39. <charset>UTF-8</charset>
    40. </encoder>
    41. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    42. <level>INFO</level>
    43. </filter>
    44. </appender>
    45. <!-- 消息日志,记录项目所有消息记录 -->
    46. <appender name="warnLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
    47. <!-- 如果指定了file属性,当天的文件名为file属性值 -->
    48. <file>${LOG_HOME}/warn.log</file>
    49. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    50. <!--日志文件输出的文件名 -->
    51. <FileNamePattern>${LOG_HOME}/warn.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
    52. <maxHistory>${LOG_MAX_HISTORY}</maxHistory>
    53. <maxFileSize>200MB</maxFileSize>
    54. <totalSizeCap>3GB</totalSizeCap>
    55. </rollingPolicy>
    56. <encoder>
    57. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
    58. <pattern>${FILE_LOG_PATTERN}</pattern>
    59. <!-- 设置字符集 -->
    60. <charset>UTF-8</charset>
    61. </encoder>
    62. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    63. <level>WARN</level><!-- 只接收错误级别的日志 -->
    64. </filter>
    65. </appender>
    66. <!-- 错误日志,记录项目标识的错误级别信息 -->
    67. <appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
    68. <file>${LOG_HOME}/error.log</file>
    69. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    70. <fileNamePattern>${LOG_HOME}/error.log.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
    71. <maxHistory>${LOG_MAX_HISTORY}</maxHistory>
    72. <maxFileSize>100MB</maxFileSize>
    73. <totalSizeCap>2GB</totalSizeCap>
    74. </rollingPolicy>
    75. <encoder>
    76. <pattern>${FILE_LOG_PATTERN}</pattern>
    77. <!-- 设置字符集 -->
    78. <charset>UTF-8</charset>
    79. </encoder>
    80. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    81. <level>ERROR</level>
    82. </filter>
    83. </appender>
    84. <!-- 消息日志,记录项目所有消息记录 -->
    85. <appender name="debugLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
    86. <!-- 如果指定了file属性,当天的文件名为file属性值 -->
    87. <file>${LOG_HOME}/debug.log</file>
    88. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    89. <!--日志文件输出的文件名 -->
    90. <FileNamePattern>${LOG_HOME}/debug.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
    91. <maxHistory>${LOG_MAX_HISTORY}</maxHistory>
    92. <maxFileSize>400MB</maxFileSize>
    93. <totalSizeCap>5GB</totalSizeCap>
    94. </rollingPolicy>
    95. <encoder>
    96. <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
    97. <pattern>${FILE_LOG_PATTERN}</pattern>
    98. <!-- 设置字符集 -->
    99. <charset>UTF-8</charset>
    100. </encoder>
    101. </appender>
    102. </included>

    这里配置了四个等级的日志DEBUG, INFO,ERROR,WARN,包括日志文件的格式和控制台打印的格式。

  2. logback各个环境的配置文件

    在创建了logback-base.xml配置文件后,实际项目中,我们需要在不同的环境打印不同的log,这个时候我们需要在logback-base.xml同目录下创建对应的配置文件;例如logback-test.xml,测试环境配置文件,内容如下:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <configuration debug="true">
    3. <include resource="logback/logback-base.xml"/>
    4. <!-- 日志输出级别 -->
    5. <root level="INFO">
    6. <appender-ref ref="STDOUT"/>
    7. <appender-ref ref="errorLog"/>
    8. <appender-ref ref="warnLog"/>
    9. <appender-ref ref="infoLog"/>
    10. <appender-ref ref="debugLog"/>
    11. </root>
    12. <logger name="jdbc.sqlonly" level="OFF" />
    13. <logger name="jdbc.audit" level="OFF" />
    14. <logger name="jdbc.resultsettable" level="OFF" />
    15. <logger name="jdbc.connection" level="INFO" />
    16. <logger name="jdbc.sqltiming" level="INFO" />
    17. </configuration>

    在这里呢我们在include了base配置的基础上,添加了另一些配置,就是那几行logger标签,对log4jdbc的日志做了些过滤,只保留了connection和sqltiming包下的log。

  3. 修改yml配置文件。

    这个时候我们需要在系统yml配置文件中添加上两行引用我们刚刚写的配置文件。

    1. logging:
    2. config: classpath:logback/logback-test.xml

    这里要注意的是,logging是一级,前面不要用tab键或者空格。

查看效果。

  1. 此时启动项目查看效果可以看到效果如下:
  2. ![](https://img2022.cnblogs.com/blog/2003574/202202/2003574-20220211162357435-1643478027.png)
  3. 日志文件中的样式:
  4. ![](https://img2022.cnblogs.com/blog/2003574/202202/2003574-20220211162407509-28011600.png)

SpringDataJpa打印Sql详情(含参数)的更多相关文章

  1. Hibernate打印SQL及附加参数

    今天在项目运行过程中,一直报一个org.hibernate.exception.GenericJDBCException: could not insert 异常,Root Cause是IBM  DB ...

  2. hibernate打印sql日志及参数

    #log4j.properties log4j.rootLogger=info, CA# ConsoleAppenderlog4j.appender.CA=org.apache.log4j.Conso ...

  3. hibernate 打印sql和参数的配置

    1.配置spring-hiberbate.xml:<prop key="hibernate.show_sql">true</prop>--强制打印sql 不 ...

  4. jpa hibernate 打印sql,format日志,打印SQL参数,打印什么指令

    环境说明:IntelliJ IDEA 2017.3.4 版本:SpringBoot 2.0.0.RELEASE:hibernate用的是JPA自带. 打印SQL 到控制台: 首先,我使用的是appli ...

  5. MyBatis 插件 : 打印 SQL 及其执行时间

    Plugins 摘一段来自MyBatis官方文档的文字. MyBatis允许你在某一点拦截已映射语句执行的调用.默认情况下,MyBatis允许使用插件来拦截方法调用: Executor(update. ...

  6. mybatis 打印sql 语句

    拦截器 package com.cares.asis.mybatis.interceptor; import java.text.DateFormat; import java.util.Date; ...

  7. mybatis 控制台打印sql

    开发时调试使用 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBe ...

  8. spring集成mybatis后,打印SQL语句

    网上说mybatis的早前版本配置打印sql还比较简单,在3.0.6之后配置方式修改了. 现在的spring-mybatis.xml配置如下: <bean id="sqlSession ...

  9. laravel5.5打印sql语句

    额.其实laravel很不方便的地方就是sql写错之后不是很好调试. 上方法. //DB::connection()->enableQueryLog(); // 开启QueryLog//$rep ...

随机推荐

  1. SpringBoot集成Actuator监控管理

    1.说明 本文详细介绍Spring Boot集成Actuator监控管理的方法, 基于已经创建好的Spring Boot工程, 然后引入Actuator依赖, 介绍监控管理相关功能的使用. Sprin ...

  2. .net core中Grpc使用报错:The remote certificate is invalid according to the validation procedure.

    因为Grpc采用HTTP/2作为通信协议,默认采用LTS/SSL加密方式传输,比如使用.net core启动一个服务端(被调用方)时: public static IHostBuilder Creat ...

  3. TYPESCRIPT中文教程基础部分下----翻译自TS官方

    type 别名 我们已经使用过 object 和 联合的方式 直接声明类型.但是某个类型在使用多次的情况下就要用到别名了. 别名的语法就像是在定义一个具名的对象一样: type Point = { x ...

  4. Python_jsonPath模块的使用

    jsonpath简介 如果有一个多层嵌套的复杂字典,想要根据key批量提取value,还是比较繁琐的.jsonPath模块就能解决这个痛点,接下来我们来学习一下jsonpath模块. 因为jsonpa ...

  5. Python_类型转换

    列表与字符串互相转换 join方法将list转换为string _list = ["a", "b", "c"] # 以".&quo ...

  6. SQL Server数据库出现“无法访问数据库XXX(objectExplorer)”的解决办法

    数据库版本为2008R2,服务器异常重启并重新挂载iscsi后,数据库出现"无法访问数据库XXX(objectExplorer)"问题. 输入SQL命令查看数据库状态 1 sele ...

  7. 微信小程序输入框上移问题解决

    微信小程序的输入框在上面还好,如果不是,在聚焦的时候页面就会上移,上方的页面信息会看不到,影响用户操作 在这里可以手动设置并获取输入框的高度来解决 这种方式虽然有的机子有点卡,但是已经算是比较完美的解 ...

  8. openlayers素材网站

    1.教程网站 http://weilin.me/ol3-primer/ch05/05-03.html 2.特效气象图 https://earth.nullschool.net/zh-cn/#curre ...

  9. vscode设置vue结构的初始代码片段

    { "Print to console": { "prefix": "vue", "body": [ "< ...

  10. MCU软件最佳实践——矩阵键盘驱动

    1.矩阵键盘vs独立按键 在mcu应用开发过程中,独立按键比较常见,但是在需要的按键数比较多时,使用矩阵键盘则可以减少io占用,提高系统资源利用率.例如,某mcu项目要求有16个按钮,如果采用独立按键 ...