当前位置:   article > 正文

Springboot JPA日志输出打印SQL语句和传入的参数 高阶篇_jpa在控制台打印完整的sql

jpa在控制台打印完整的sql

如果仅仅想看到sql语句和参数就完事了,可以参考这篇就足矣:

https://blog.csdn.net/qq_35387940/article/details/102561244

这篇里面我们最终要实现的效果是:

日志里面直接输出的SQL语句是带上传入的参数,直接从日志复制出来就可以使用的SQL语句。
 

首先在原项目上,在pom.xml里加入依赖:

  1. <!--监控sql日志-->
  2. <dependency>
  3. <groupId>org.bgee.log4jdbc-log4j2</groupId>
  4. <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
  5. <version>1.16</version>
  6. </dependency>

新增 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

在application.yml文件里面稍作修改:

  1. #服务端口
  2. server:
  3. port: 8055
  4. spring:
  5. datasource:
  6. # driver-class-name: com.mysql.cj.jdbc.Driver
  7. driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
  8. # url: jdbc:mysql://localhost:3306/testdemo?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
  9. url: jdbc:log4jdbc:mysql://localhost:3306/testdemo?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
  10. hikari: # springboot 2.0 整合了hikari ,据说这是目前性能最好的java数据库连接池
  11. username: root
  12. password: root
  13. minimum-idle: 5 # 最小空闲连接数量
  14. idle-timeout: 180000 # 空闲连接存活最大时间,默认60000010分钟)
  15. maximum-pool-size: 10 # 连接池最大连接数,默认是10
  16. auto-commit: true # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
  17. pool-name: MyHikariCP # 连接池名称
  18. max-lifetime: 1800000 # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认180000030分钟
  19. connection-timeout: 30000 # 数据库连接超时时间,默认30秒,即30000
  20. # connection-test-query: SELECT 1 #连接池每分配一条连接前执行的查询语句(如:SELECT 1),以验证该连接是否是有效的。如果你的驱动程序支持 JDBC4,HikariCP 强烈建议我们不要设置此属性
  21. jpa:
  22. hibernate:
  23. ddl-auto: update # 第一次建表create 后面用update,要不然每次重启都会新建表
  24. # show-sql: true #打印执行的sql语句
  25. database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #设置数据库方言 记住必须要使用 MySQL5InnoDBDialect 指定数据库类型对应InnoDB ;如果使用MySQLDialect 则对应的是MyISAM
  26. test-key: JCccc-test-key-one

OK,这时候我们把项目运行,调用下相关接口:

相关测试的mapper层方法:

  1. @Query(value="select * from user where name=(:name)",nativeQuery = true)
  2. User getUserByName(@Param("name") String name);

控制台日志打印情况: 

可以看到我们想要的效果已经出来了,但是很多多余的日志都出来了,显然要对这些日志做筛选。
通过日志level级别,进行筛选。

 

在resources 里新建 logback.xml文件:

 具体配置代码(注意注释简述,筛选相关的在最底下):

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration scan="true">
  3. <!-- 从application.yml 中注入变量 -->
  4. <!-- <springProperty scope="context" name="LOG_PATH" source="log.home"/> -->
  5. <!-- <springProperty scope="context" name="APPDIR" source="spring.application.name"/> -->
  6. <property name="LOG_PATH" value="./logs"/>
  7. <property name="APPDIR" value="graceLogs"/>
  8. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  9. <encoder>
  10. <pattern>1-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
  11. <charset>GBK</charset>
  12. </encoder>
  13. </appender>
  14. <!-- error级别日志文件输出,按日期时间滚动记录输出 -->
  15. <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
  16. <file>${LOG_PATH}/${APPDIR}/log_error.log</file>
  17. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  18. <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  19. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  20. <maxFileSize>500MB</maxFileSize>
  21. </timeBasedFileNamingAndTriggeringPolicy>
  22. </rollingPolicy>
  23. <append>true</append>
  24. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  25. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
  26. <charset>utf-8</charset>
  27. </encoder>
  28. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  29. <level>error</level>
  30. <onMatch>ACCEPT</onMatch>
  31. <onMismatch>DENY</onMismatch>
  32. </filter>
  33. </appender>
  34. <!-- warn级别日志文件输出,按日期时间滚动记录输出 -->
  35. <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
  36. <file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
  37. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  38. <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  39. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  40. <maxFileSize>2MB</maxFileSize>
  41. </timeBasedFileNamingAndTriggeringPolicy>
  42. </rollingPolicy>
  43. <append>true</append>
  44. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  45. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
  46. <charset>utf-8</charset> </encoder>
  47. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  48. <level>warn</level>
  49. <onMatch>ACCEPT</onMatch>
  50. <onMismatch>DENY</onMismatch>
  51. </filter>
  52. </appender>
  53. <!-- info级别日志文件输出,按日期时间滚动记录输出 -->
  54. <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
  55. <file>${LOG_PATH}/${APPDIR}/log_info.log</file>
  56. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  57. <fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  58. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  59. <maxFileSize>2MB</maxFileSize>
  60. </timeBasedFileNamingAndTriggeringPolicy>
  61. </rollingPolicy>
  62. <append>true</append>
  63. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  64. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
  65. <charset>utf-8</charset>
  66. </encoder>
  67. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  68. <level>info</level>
  69. <onMatch>ACCEPT</onMatch>
  70. <onMismatch>DENY</onMismatch>
  71. </filter>
  72. </appender>
  73. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  74. <encoder>
  75. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
  76. </encoder>
  77. </appender>
  78. <!--设置为OFF,即屏蔽; 留下sqltiming作为INFO级别输出-->
  79. <logger name="jdbc.connection" level="OFF"/>
  80. <logger name="jdbc.resultset" level="OFF"/>
  81. <logger name="jdbc.resultsettable" level="OFF"/>
  82. <logger name="jdbc.audit" level="OFF"/>
  83. <logger name="jdbc.sqltiming" level="INFO"/>
  84. <logger name="jdbc.sqlonly" level="OFF"/>
  85. <!--设置日志打印级别为INFO-->
  86. <root level="INFO">
  87. <appender-ref ref="CONSOLE"/>
  88. <appender-ref ref="FILEINFO"/>
  89. <appender-ref ref="FILEWARN"/>
  90. <appender-ref ref="FILEERROR"/>
  91. </root>
  92. </configuration>

OK,现在重新启动项目,调用接口看看SQL语句和参数打印情况,很好,达到了我们要的效果:

ps:sqltiming和sqlonly差别是多打印了sql语句的耗时,如果不想要这个时间可以修改筛选里面的项。

顺便看看日志文件也输出到了对应的文件夹(这些日志文件会按照日志滚动记录的,现场跑看不出效果):

 

 

OK,到此。 




PS:

如果是mybatis,如上文一样使用没区别,简单讲下:

1.导入jar

2.改yml配置

3.添加文件

 4.可以用了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/405699
推荐阅读
相关标签
  

闽ICP备14008679号