SpringBoot+mybatis+druid+log42实现打印sql日志

我的SpringBoot版本为:   2.1.10.RELEASE

首先在pom文件里面添加jar包,添加了log42,druid,mysql的jar包

        <!--log4j2-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

        <!--druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

然后是yml文件配置(仅剩余myabtis,datasource配置)重点是那个filter:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource   #配置当前要使用的数据源的操作类型那个
    url: jdbc:mysql://127.0.0.1:3306/test
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: 111
    password: 111
    druid:
      initial-size: 5 # 初始化连接数
      min-idle: 5 # 最小连接数
      max-active: 20 # 最大连接数
      max-wait: 60000 # #连接超时超时配置 1000*60 1min
      time-between-eviction-runs-millis: 60000  # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      min-evictable-idle-time-millis: 600000 # 连接保持空闲而不被驱逐的最长时间。10min(10*60*1000)
      validation-query: SELECT 1 #对于数据库连接的检测
      test-while-idle: true #如果空闲时间大于time-between-eviction-runs-millis 使用validation-query检测连接是否有效,无效则淘汰
      test-on-borrow: false #申请连接时检测连接是否有效 影响性能关闭
      filters: stat,wall,log4j2     #druid监控配置
      filter:
        commons-log:
          connection-log-enabled: false
          statement-log-enabled: false
          result-set-log-enabled: true # 表示是否显示结果集。
          statement-executable-sql-log-enable: true # 表示是否显示SQL语句。

mybatis:
  mapper-locations: classpath:mybatis/*/*.xml #指定xml位置
  configLocation: classpath:mybatis/mybatis-config.xml # 配置信息

然后是  mybatis-config.xml  重点是最后一行setting

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 全局参数 -->
    <settings>
        <!-- 使全局的映射器启用或禁用缓存。 -->
        <setting name="cacheEnabled" value="true"/>
        <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
        <setting name="aggressiveLazyLoading" value="true"/>
        <!-- 是否允许单条sql 返回多个数据集  (取决于驱动的兼容性) default:true -->
        <setting name="multipleResultSetsEnabled" value="true"/>
        <!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
        <setting name="useColumnLabel" value="true"/>
        <!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。  default:false  -->
        <setting name="useGeneratedKeys" value="true"/>
        <!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分  FULL:全部  -->
        <setting name="autoMappingBehavior" value="PARTIAL"/>
        <!-- 这是默认的执行类型  (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新)  -->
        <setting name="defaultExecutorType" value="SIMPLE"/>
        <!-- 使用驼峰命名法转换字段。 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- 设置本地缓存范围 session:就会有数据的共享  statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
        <setting name="localCacheScope" value="SESSION"/>
        <!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
        <setting name="jdbcTypeForNull" value="NULL"/>
        <!-- myabtis使用log4j2输出日志 -->
        <setting name="logImpl" value="LOG4J2" />
    </settings>
</configuration>

最后的重点,log4j2.xml配置 重点是 sqlRollingLog 这个appender

<?xml version="1.0" encoding="UTF-8"?>
<!-- 根节点Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger) -->
<!-- status:这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出-->
<!-- status="off",log4j2把自身事件记录到控制台的配置,off表示不记录,其余的记录有trace,debug,info,warn,error,fatal -->
<!-- monitorInterval:用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s;Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="off">
	<Appenders>
		<!-- SYSTEM_OUT是输出到统一的输出流,没有指定日志文件 -->
		<Console name="Console" target="SYSTEM_OUT">
			<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}]%p[%t]%c{1}|%m%n" />
		</Console>

		<!-- RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender.   name:指定Appender的名字.   fileName:指定输出日志的目的文件带全路径的文件名.   filePattern:指定新建日志文件的名称格式. -->
		<!-- 详细日志 -->
		<RollingRandomAccessFile name="DetailRollingFile" fileName="log/test/test_detail.log" filePattern="log/test/test_detail.log.%d{yyyyMMddHH}" immediateFlush="true">
			<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
			<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
			<!-- PatternLayout:输出格式,不设置默认为:%m%n. -->
			<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}]%p[%t]%c{1}|%m%n" charset="UTF-8"/>
			<!-- Policies:指定滚动日志的策略. -->
			<Policies>
				<!-- TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. -->
				<TimeBasedTriggeringPolicy interval="1"/>
			</Policies>
		</RollingRandomAccessFile>
		<!-- 简要日志 -->
		<RollingRandomAccessFile name="MpspRollingFile" fileName="log/test/mpsp.log" filePattern="log/test/mpsp.log.%d{yyyyMMddHH}">
			<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
			<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}]%m%n"/>
			<Policies>
				<TimeBasedTriggeringPolicy interval="1"/>
			</Policies>
			<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性) -->
			<!--<DefaultRolloverStrategy max="200"/>-->
		</RollingRandomAccessFile>
		<!-- 性能监控日志 -->
		<RollingRandomAccessFile name="ssRollingLog" fileName="log/test/ss.log" filePattern="log/test/ss.log.%d{yyyyMMddHH}">
			<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
			<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}]%m%n"/>
			<Policies>
				<TimeBasedTriggeringPolicy interval="1"/>
			</Policies>
		</RollingRandomAccessFile>
		<!-- sql监控日志 -->
		<RollingRandomAccessFile name="sqlRollingLog" fileName="log/test/sql.log" filePattern="log/test/sql.log.%d{yyyyMMddHH}">
			<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
			<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}]%p[%t]%c{1}|%m%n" charset="UTF-8"/>
			<Policies>
				<TimeBasedTriggeringPolicy interval="1"/>
			</Policies>
		</RollingRandomAccessFile>
	</Appenders>

	<!--定义logger,只有定义了logger并引入的appender,appender才会生效-->
	<Loggers>
		<!-- additivity的值如果为false的话,就不会在控制台上输出或者为该Logger再增加一个输出源Consloe -->
		<Logger name="mpspLog" level="INFO" additivity="false">
			<AppenderRef ref="MpspRollingFile" />
		</Logger>
		<Logger name="ssLog" level="INFO" additivity="false">
			<AppenderRef ref="ssRollingLog" />
		</Logger>
		<Logger name="detailLog" level="INFO" additivity="false">
			<AppenderRef ref="DetailRollingFile" />
		</Logger>
		<Logger name="com.umpay" level="INFO" additivity="false">
			<AppenderRef ref="DetailRollingFile" />
		</Logger>

		<logger name="druid.sql.Statement" level="debug" additivity="false">
			<appender-ref ref="sqlRollingLog"/>
		</logger>
		<logger name="druid.sql.ResultSet" level="debug" additivity="false">
			<appender-ref ref="sqlRollingLog"/>
		</logger>

		<Root level="info">
			<AppenderRef ref="Console" />
		</Root>
	</Loggers>
</Configuration>

配置好了你就可以看到打印在文件里面的sql执行语句和结果集了

发布了68 篇原创文章 · 获赞 22 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/ljy950914/article/details/104498193
今日推荐