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執行語句和結果集了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章