SpringDataJpa打印Sql詳情(含參數)


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鍵或者空格。

查看效果

此時啟動項目查看效果可以看到效果如下:

日志文件中的樣式:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM