Druid搭配log4j2输出SQL语句和结果

一、引言

其实Druid的内置了log4jdbc来显示SQL语句,虽然显示效果不如原生的log4jdbc效果好,但是因为内置所以不需要其他更多的配置。

二、使用

1. 创建基于druid的logger
 
   
  1. <bean id="log-filter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter">
  2. <property name="connectionLogEnabled" value="false"/>
  3. <property name="statementLogEnabled" value="false"/>
  4. <property name="resultSetLogEnabled" value="true"/>
  5. <property name="statementExecutableSqlLogEnable" value="true"/>
  6. </bean>
a.  resultSetLogEnabled 表示是否显示结果集。
b.  statementExecutableSqlLogEnable 表示是否显示SQL语句。
2. 在 DruidDataSource中配置
 
   
  1. <!-- 数据连接池 -->
  2. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  3. .....
  4. <property name="filters" value="stat,wall"/>
  5. ......
  6. <property name="proxyFilters">
  7. <list>
  8. <ref bean="log-filter"/>
  9. </list>
  10. </property>
  11. </bean>
proxyFilters是代理filter的意思,将我们在第一步创建的log-filter写入进去。

三、log4j2中的设置

 
   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Log4j 2.x 配置文件。每30秒自动检查和应用配置文件的更新; -->
  3. <configuration status="warn" monitorInterval="30" strict="true" schema="Log4J-V2.2.xsd">
  4. <Properties>
  5. <Property name="logdir">${sys:catalina.base}/logs</Property>
  6. </Properties>
  7. <appenders>
  8. <!-- 输出到控制台 -->
  9. <console name="Console" target="SYSTEM_OUT">
  10. <!-- 需要记录的级别 -->
  11. <!-- <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" /> -->
  12. <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %level [%C{36}.%M] - %msg%n"/>
  13. </console>
  14. <!-- 输出到文件,按天或者超过80MB分割 -->
  15. <rollingFile name="RollingFile" fileName="conerstone.log"
  16. filePattern="${logdir}/logs/$${date:yyyy-MM}/xjj-%d{yyyy-MM-dd}-%i.log.gz">
  17. <!-- 需要记录的级别 -->
  18. <!-- <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> -->
  19. <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %level [%C{36}.%M] - %msg%n"/>
  20. <policies>
  21. <onStartupTriggeringPolicy/>
  22. <timeBasedTriggeringPolicy/>
  23. <sizeBasedTriggeringPolicy size="1 MB"/>
  24. </policies>
  25. </rollingFile>
  26. </appenders>
  27. <loggers>
  28. <!-- 全局配置 -->
  29. <root level="info">
  30. <appenderRef ref="Console"/>
  31. <appenderRef ref="RollingFile"/>
  32. </root>
  33. <logger name="org.springframework.web" level="debug" additivity="false">
  34. <appenderRef ref="Console"/>
  35. </logger>
  36. <logger name="com.mc.core.service" level="debug" additivity="false">
  37. <appender-ref ref="Console"/>
  38. </logger>
  39. <!-- druid配置 -->
  40. <logger name="druid.sql.Statement" level="debug" additivity="false">
  41. <appender-ref ref="Console"/>
  42. </logger>
  43. <logger name="druid.sql.ResultSet" level="debug" additivity="false">
  44. <appender-ref ref="Console"/>
  45. </logger>
  46. </loggers>
  47. </configuration>
其中需要特别注意41行之后的代码,表示是否显示sql语句和结果,如果不想显示结果,可以在第一步中将 resultSetLogEnabled 改为false
在Spring Boot应用中,可以通过在application.yml文件中配置,实现打印JDBCSQL语句的功能,并且格式化输出到控制台。 具体的实现步骤如下: 1. 在application.yml文件中,配置以下信息: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test username: root password: root driver-class-name: com.mysql.jdbc.Driver # 打印SQL语句 # 可选的值:NONE、CONSOLE、LOG_FILE、LOG_FILE_AND_CONSOLE # 默认值:NONE datasource: type: com.alibaba.druid.pool.DruidDataSource # 配置Druid数据源,可以省略 druid: initial-size: 5 max-active: 20 min-idle: 5 max-wait: 60000 pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 validation-query: SELECT 1 test-on-borrow: true test-while-idle: true time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 filters: stat,wall,log4j connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 配置日志级别为DEBUG,打印SQL语句 # 可以使用logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG代替 logging: level: org: springframework: jdbc: core: JdbcTemplate: DEBUG # 配置输出到控制台,并格式化输出SQL语句 pattern: console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" appender: console: target: SYSTEM_OUT encoder: pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" ``` 其中,logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG可以在application.yml中配置,也可以在log4j或logback等日志框架中配置。 2. 在代码中使用JdbcTemplate时,即可在控制台中看到打印的SQL语句,例如: ```java @Autowired private JdbcTemplate jdbcTemplate; public void query() { List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT * FROM user"); //... } ``` 在控制台中会打印出格式化后的SQL语句,例如: ```java 2021-07-28 11:08:59.887 [main] DEBUG o.s.j.c.JdbcTemplate - Executing SQL query [SELECT * FROM user] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值