SpringDataJpa列印Sql詳情(含引數)

柳先開發表於2022-02-11

Spring Data Jpa列印Sql詳情(帶sql引數)

這裡使用的是 log4jdbc,yml配置檔案裡的資料來源配置也要做相應的修改

pom檔案引入

<dependency>
    <groupId>com.googlecode.log4jdbc</groupId>
    <artifactId>log4jdbc</artifactId>
    <version>1.2</version>
</dependency>

修改yml配置檔案

spring:
  datasource:
    url: jdbc:log4jdbc:mysql://xxxxxxxxxxxxxxxxxxxxxx
    username: root
    password: 123456
    driver-class-name: net.sf.log4jdbc.DriverSpy 

這裡一共需要改兩個地方,一個是driver-class-name,一個是url,要改成對應的log4j的。

新增配置檔案log4jdbc.log4j2.properties

在專案resources目錄下新建一個log4jdbc.log4j2.properties檔案,內容如下

# If you use SLF4J. First, you need to tell log4jdbc-log4j2 that you want to use the SLF4J logger
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檔案,檔案內容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <included>
        <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
        <jmxConfigurator/>
        <property name="LOG_FILE" value="/aplog/prod"/>
        <!--定義日誌檔案的儲存地址 勿在 LogBack 的配置中使用相對路徑 -->
        <property name="LOG_HOME" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-./tmp}}/}}"/>
        <!-- 最大儲存歷史日誌天數 -->
        <property name="LOG_MAX_HISTORY" value="30"/>
        <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(-&#45;&#45;){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint}  %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
        <!--              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint}  %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(-&#45;&#45;){faint} %clr([%15.15t]){faint} %X{REQ_ID} %clr(%-40.40logger{39}){cyan} %clr(:){faint}  %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>-->
    
        <property name="FILE_LOG_PATTERN"
                  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}"/>
    
    
        <!-- 控制檯輸出 -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <!--<withJansi>true</withJansi>-->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符 -->
                <pattern>${CONSOLE_LOG_PATTERN}</pattern>
                <!-- 設定字符集 -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <!-- 訊息日誌,記錄專案所有訊息記錄 -->
        <appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 如果指定了file屬性,當天的檔名為file屬性值 -->
            <file>${LOG_HOME}/info.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!--日誌檔案輸出的檔名 -->
                <FileNamePattern>${LOG_HOME}/info.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
                <maxHistory>${LOG_MAX_HISTORY}</maxHistory>
                <maxFileSize>200MB</maxFileSize>
                <totalSizeCap>8GB</totalSizeCap>
            </rollingPolicy>
            <encoder>
                <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符 -->
                <pattern>${FILE_LOG_PATTERN}</pattern>
                <!-- 設定字符集 -->
                <charset>UTF-8</charset>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
        </appender>
    
        <!-- 訊息日誌,記錄專案所有訊息記錄 -->
        <appender name="warnLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 如果指定了file屬性,當天的檔名為file屬性值 -->
            <file>${LOG_HOME}/warn.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!--日誌檔案輸出的檔名 -->
                <FileNamePattern>${LOG_HOME}/warn.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
                <maxHistory>${LOG_MAX_HISTORY}</maxHistory>
                <maxFileSize>200MB</maxFileSize>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy>
            <encoder>
                <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符 -->
                <pattern>${FILE_LOG_PATTERN}</pattern>
                <!-- 設定字符集 -->
                <charset>UTF-8</charset>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>WARN</level><!-- 只接收錯誤級別的日誌 -->
            </filter>
        </appender>
    
        <!-- 錯誤日誌,記錄專案標識的錯誤級別資訊 -->
        <appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_HOME}/error.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_HOME}/error.log.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <maxHistory>${LOG_MAX_HISTORY}</maxHistory>
                <maxFileSize>100MB</maxFileSize>
                <totalSizeCap>2GB</totalSizeCap>
            </rollingPolicy>
            <encoder>
                <pattern>${FILE_LOG_PATTERN}</pattern>
                <!-- 設定字符集 -->
                <charset>UTF-8</charset>
            </encoder>
    
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
        </appender>
    
        <!-- 訊息日誌,記錄專案所有訊息記錄 -->
        <appender name="debugLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 如果指定了file屬性,當天的檔名為file屬性值 -->
            <file>${LOG_HOME}/debug.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!--日誌檔案輸出的檔名 -->
                <FileNamePattern>${LOG_HOME}/debug.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
                <maxHistory>${LOG_MAX_HISTORY}</maxHistory>
                <maxFileSize>400MB</maxFileSize>
                <totalSizeCap>5GB</totalSizeCap>
            </rollingPolicy>
            <encoder>
                <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符 -->
                <pattern>${FILE_LOG_PATTERN}</pattern>
                <!-- 設定字符集 -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
    
    </included>
    

    這裡配置了四個等級的日誌DEBUG, INFO,ERROR,WARN,包括日誌檔案的格式和控制檯列印的格式。

  2. logback各個環境的配置檔案

    在建立了logback-base.xml配置檔案後,實際專案中,我們需要在不同的環境列印不同的log,這個時候我們需要在logback-base.xml同目錄下建立對應的配置檔案;例如logback-test.xml,測試環境配置檔案,內容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration debug="true">
    
        <include resource="logback/logback-base.xml"/>
        <!-- 日誌輸出級別 -->
        <root level="INFO">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="errorLog"/>
            <appender-ref ref="warnLog"/>
            <appender-ref ref="infoLog"/>
            <appender-ref ref="debugLog"/>
        </root>
        <logger name="jdbc.sqlonly" level="OFF" />
        <logger name="jdbc.audit" level="OFF" />
        <logger name="jdbc.resultsettable" level="OFF" />
        <logger name="jdbc.connection" level="INFO" />
        <logger name="jdbc.sqltiming" level="INFO" />
    
    </configuration>
    

    在這裡呢我們在include了base配置的基礎上,新增了另一些配置,就是那幾行logger標籤,對log4jdbc的日誌做了些過濾,只保留了connection和sqltiming包下的log。

  3. 修改yml配置檔案。

    這個時候我們需要在系統yml配置檔案中新增上兩行引用我們剛剛寫的配置檔案。

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

    這裡要注意的是,logging是一級,前面不要用tab鍵或者空格。

檢視效果

此時啟動專案檢視效果可以看到效果如下:

日誌檔案中的樣式:

相關文章