LogBack+MybatisPlus實(shí)現(xiàn)打印sql日志
首先在配置文件里面配置MybatisPlus的打印日志的相關(guān)配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl # 使用 Slf4j 作為日志實(shí)現(xiàn)然后在logback-spring.xml配置中定義一個(gè)appender用于輸出sql日志,appender是logback的日志輸出器,通過(guò)file指定日志輸出的目錄和文件名稱(chēng),rollingPolicy表示是滾動(dòng)策略,按天滾動(dòng)切割日志文件進(jìn)行備份,也就是當(dāng)天的日志會(huì)在寫(xiě)sql.log里面,歷史日志,例如說(shuō)昨天的日志會(huì)被切割一份另外存起來(lái),maxHistory是只存3天日志,其他的歷史日志都會(huì)被刪除掉,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="log.path" value="./logs"/>
<property name="console.log.pattern"
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %highlight([%-5level]) [%X{traceId}] %green([%thread]) %boldMagenta(%logger{36})[%line] - %msg%n"/>
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%-5level] [%X{traceId}] [%thread] %logger{36}[%line] - %msg%n"/>
<contextListener class="com.xdf.smart.edu.common.log.listener.TtlMDCListener" />
<!-- 控制臺(tái)輸出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${console.log.pattern}</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
<!-- SQL 日志 appender -->
<appender name="file_sql" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sql.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sql.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 3 天 -->
<maxHistory>3</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 過(guò)濾的級(jí)別,只記錄 DEBUG 及以上級(jí)別的日志 -->
<level>DEBUG</level>
</filter>
</appender>
<!-- sql異步輸出 -->
<appender name="async_sql" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丟失日志.默認(rèn)的,如果隊(duì)列的80%已滿,則會(huì)丟棄 TRACE、DEBUG、INFO 級(jí)別的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默認(rèn)的隊(duì)列的深度,該值會(huì)影響性能.默認(rèn)值為256 -->
<queueSize>512</queueSize>
<!-- 添加附加的appender,最多只能添加一個(gè) -->
<appender-ref ref="file_sql"/>
</appender>
<!-- 統(tǒng)一打印 MyBatis 和 MyBatis-Plus 的 SQL 相關(guān)日志 -->
<logger name="com.baomidou.mybatisplus" level="DEBUG" additivity="false">
<appender-ref ref="async_sql"/>
</logger>
<!--系統(tǒng)操作日志-->
<root level="INFO">
<appender-ref ref="console"/>
</root>
</configuration>上面就是單純配了一個(gè)sql日志打印的appender,用來(lái)打印sql執(zhí)行日志,運(yùn)行jar包后會(huì)在jar包的同級(jí)目錄自己創(chuàng)建一個(gè)log文件夾,里面放sql.log文件。
在 Logback 里,logger 與 root 標(biāo)簽都能引用 appender 來(lái)輸出日志。
- logger 標(biāo)簽:可指定特定類(lèi)或包的日志處理規(guī)則,借助 name 屬性指定類(lèi)或包名,能精準(zhǔn)控制日志輸出。
- root 標(biāo)簽:作為所有 logger 的父 logger,定義了默認(rèn)的日志處理規(guī)則。若某個(gè) logger 沒(méi)有特別指定處理規(guī)則,就會(huì)使用 root 標(biāo)簽的規(guī)則。
所以上面的配置就是在logger標(biāo)簽里使用async_sql這個(gè)appender來(lái)打印sql日志,而async_sql其實(shí)就只是配置了異步輸出,在async_sql里面又添加了file_sql來(lái)打印sql日志,這樣可以實(shí)現(xiàn)異步打印sql執(zhí)行日志,需要注意的是要記得修改上面logger標(biāo)簽里面的mapper接口的類(lèi)路徑
下面提供完整的LogBack配置,通常就是打印info、error日志、sql日志,由于平常用日志排查問(wèn)題用的少,所以這里只保留3天歷史,特別是sql日志,很快就會(huì)文件變得很大,因?yàn)閟ql執(zhí)行的日志都會(huì)寫(xiě)進(jìn)去,所以更不能保留太久,之前就是sql日志都是通過(guò)P6Spy去寫(xiě)入到同一個(gè)文件里面,導(dǎo)致直接日志文件占了40多G的內(nèi)存,所以這里改成了用mybatisplus日志切割,下面提供了常用的日志配置,注意我這個(gè)系統(tǒng)是因?yàn)橥瑫r(shí)用來(lái)mybatis和mybatisPlus,所以兩個(gè)日志都要打印
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="log.path" value="./logs"/>
<property name="console.log.pattern"
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %highlight([%-5level]) [%X{traceId}] %green([%thread]) %boldMagenta(%logger{36})[%line] - %msg%n"/>
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%-5level] [%X{traceId}] [%thread] %logger{36}[%line] - %msg%n"/>
<contextListener class="com.xdf.smart.edu.common.log.listener.TtlMDCListener" />
<!-- 控制臺(tái)輸出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${console.log.pattern}</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
<!-- SQL 日志 appender -->
<appender name="file_sql" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sql.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sql.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 3 天 -->
<maxHistory>3</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 過(guò)濾的級(jí)別,只記錄 DEBUG 及以上級(jí)別的日志 -->
<level>DEBUG</level>
</filter>
</appender>
<!-- 系統(tǒng)日志輸出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/exam-mark-info.log</file>
<!-- 滾動(dòng)策略:基于時(shí)間創(chuàng)建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/exam-mark-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 3天 -->
<maxHistory>3</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過(guò)濾的級(jí)別 -->
<level>INFO</level>
<!-- 匹配時(shí)的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時(shí)的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/exam-mark-error.log</file>
<!-- 滾動(dòng)策略:基于時(shí)間創(chuàng)建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/exam-mark-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 3天 -->
<maxHistory>3</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過(guò)濾的級(jí)別 -->
<level>ERROR</level>
<!-- 匹配時(shí)的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時(shí)的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- info異步輸出 -->
<appender name="async_info" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丟失日志.默認(rèn)的,如果隊(duì)列的80%已滿,則會(huì)丟棄 TRACE、DEBUG、INFO 級(jí)別的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默認(rèn)的隊(duì)列的深度,該值會(huì)影響性能.默認(rèn)值為256 -->
<queueSize>512</queueSize>
<!-- 添加附加的appender,最多只能添加一個(gè) -->
<appender-ref ref="file_info"/>
</appender>
<!-- error異步輸出 -->
<appender name="async_error" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丟失日志.默認(rèn)的,如果隊(duì)列的80%已滿,則會(huì)丟棄 TRACE、DEBUG、INFO 級(jí)別的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默認(rèn)的隊(duì)列的深度,該值會(huì)影響性能.默認(rèn)值為256 -->
<queueSize>512</queueSize>
<!-- 添加附加的appender,最多只能添加一個(gè) -->
<appender-ref ref="file_error"/>
</appender>
<!-- sql異步輸出 -->
<appender name="async_sql" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丟失日志.默認(rèn)的,如果隊(duì)列的80%已滿,則會(huì)丟棄 TRACE、DEBUG、INFO 級(jí)別的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默認(rèn)的隊(duì)列的深度,該值會(huì)影響性能.默認(rèn)值為256 -->
<queueSize>512</queueSize>
<!-- 添加附加的appender,最多只能添加一個(gè) -->
<appender-ref ref="file_sql"/>
</appender>
<!-- 【打印MyBatisPlus條件構(gòu)造器的日志】 -->
<logger name="com.baomidou.mybatisplus" level="DEBUG" additivity="false">
<appender-ref ref="async_sql"/>
</logger>
<!-- 這個(gè)logger的name需要改成自己mapper接口的類(lèi)路徑【打印MyBatis日志】 -->
<logger name="com.xxx.mapper" level="DEBUG">
<appender-ref ref="async_sql"/>
</logger>
<!--系統(tǒng)操作日志-->
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="async_info"/>
<appender-ref ref="async_error"/>
</root>
</configuration>到此這篇關(guān)于LogBack+MybatisPlus實(shí)現(xiàn)打印sql日志的文章就介紹到這了,更多相關(guān)MybatisPlus LogBack 打印sql日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Security實(shí)現(xiàn)退出登錄和退出處理器
本文主要介紹了Spring Security實(shí)現(xiàn)退出登錄和退出處理器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Java使用FreeMarker來(lái)實(shí)現(xiàn)Word自定義導(dǎo)出功能
Java FreeMarker是一個(gè)用Java語(yǔ)言編寫(xiě)的模板引擎,它可以基于模板來(lái)生成文本輸出,并且與Web容器無(wú)關(guān),在對(duì)一些特定導(dǎo)出功能,使用常規(guī)Excel無(wú)法解決的,通常使用Word來(lái)實(shí)現(xiàn)導(dǎo)出功能,這篇介紹下如何在Java中使用FreeMarker模板注入方式來(lái)實(shí)現(xiàn)Word導(dǎo)出功能2025-09-09
使用jmx?exporter采集kafka指標(biāo)示例詳解
這篇文章主要為大家介紹了使用jmx?exporter采集kafka指標(biāo)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Java springboot項(xiàng)目jar發(fā)布過(guò)程解析
這篇文章主要介紹了Java springboot項(xiàng)目jar發(fā)布過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
SpringCloudAlibaba整合服務(wù)網(wǎng)關(guān)GateWay教程
文章介紹了Spring Cloud Gateway和Zuul的區(qū)別,并詳細(xì)描述了如何使用Gateway進(jìn)行服務(wù)轉(zhuǎn)發(fā)和自定義TokenFilter實(shí)現(xiàn)參數(shù)攔截訪問(wèn)2026-01-01
Java中的異步操作CompletableFuture示例詳解
CompletableFuture是Java8引入的異步編程工具,支持非阻塞的鏈?zhǔn)秸{(diào)用和組合操作,提供了強(qiáng)大的異步任務(wù)編排能力,本文通過(guò)實(shí)例代碼講解Java中的異步操作CompletableFuture,感興趣的朋友跟隨小編一起看看吧2026-02-02
Java面試題沖刺第三十天--數(shù)據(jù)庫(kù)(6)
這篇文章主要為大家分享了最有價(jià)值的三道關(guān)于數(shù)據(jù)庫(kù)的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下2021-09-09

