当前位置:网站首页>如何配置 logback?30分鐘讓你徹底學會代碼熬夜敲
如何配置 logback?30分鐘讓你徹底學會代碼熬夜敲
2022-06-29 16:27:00 【Java愛好狂.】
logack 簡介
logback 官網:https://logback.qos.ch/
Logback是由log4j創始人設計的又一個開源日志組件。logback當前分成三個模塊:logback-core,logback- classic和logback-access。logback-core是其它兩個模塊的基礎模塊。logback-classic是log4j的一個 改良版本。此外logback-classic完整實現SLF4J API使你可以很方便地更換成其它日志系統如log4j或JDK14 Logging。logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能。
配置文件詳解
這部分主要來學習下logback配置文件的一些配置項。
configuration
先來看這張圖,這個結構就是整個logback.xml配置文件的結構。

編輯切換為居中
添加圖片注釋,不超過 140 字(可選)
對應來看下配置文件:
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <property name="glmapper-name" value="glmapper-demo" /> <contextName>${glmapper-name}</contextName> <appender> //xxxx </appender> <logger> //xxxx </logger> <root> //xxxx </root> </configuration> 複制代碼
ps:想使用spring擴展profile支持,要以logback-spring.xml命名,其他如property需要改為springProperty
scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true。
scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單比特,默認單比特是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。
debug:當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。
contextName
每個logger都關聯到logger上下文,默認上下文名稱為“default”。但可以使用contextName標簽設置成其他名字,用於區分不同應用程序的記錄
property
用來定義變量值的標簽,property標簽有兩個屬性,name和value;其中name的值是變量的名稱,value的值是變量定義的值。通過property定義的值會被插入到logger上下文中。定義變量後,可以使“${name}”來使用變量。如上面的xml所示。
logger
用來設置某一個包或者具體的某一個類的日志打印級別以及指定appender。
root
根logger,也是一種logger,且只有一個level屬性
appender
負責寫日志的組件,下面會細說
filter
filter其實是appender裏面的子元素。它作為過濾器存在,執行一個過濾器會有返回DENY,NEUTRAL,ACCEPT三個枚舉值中的一個。
DENY:日志將立即被拋弃不再經過其他過濾器
NEUTRAL:有序列錶裏的下個過濾器過接著處理日志
ACCEPT:日志會被立即處理,不再經過剩餘過濾器
案例分析
首先來配置一個非常簡單的文件。這裏申請下,我使用的是 logback-spring.xml。和 logback.xml 在properties上有略微差別。其他都一樣。
工程:springboot+web
先來看下項目目錄

編輯切換為居中
添加圖片注釋,不超過 140 字(可選)
properties中就是指定了日志的打印級別和日志的輸出比特置:
#設置應用的日志級別 logging.level.com.glmapper.spring.boot=INFO #路徑 logging.path=./logs 複制代碼
通過控制臺輸出的log
logback-spring.xml的配置如下:
<configuration> <!-- 默認的控制臺日志輸出,一般生產環境都是後臺啟動,這個沒太大作用 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>%d{HH:mm:ss.SSS} %-5level %logger{80} - %msg%n</Pattern> </encoder> </appender> <root level="info"> <appender-ref ref="STDOUT"/> </root> </configuration> 複制代碼
打印日志的controller
private static final Logger LOGGER = LoggerFactory.getLogger(HelloController.class); @Autowired private TestLogService testLogService; @GetMapping("/hello") public String hello(){ LOGGER.info("GLMAPPER-SERVICE:info"); LOGGER.error("GLMAPPER-SERVICE:error"); testLogService.printLogToSpecialPackage(); return "hello spring boot"; }
驗證結果:
01:50:39.633 INFO com.glmapper.spring.boot.controller.HelloController - GLMAPPER-SERVICE:info 01:50:39.633 ERROR com.glmapper.spring.boot.controller.HelloController - GLMAPPER-SERVICE:error 複制代碼
上面的就是通過控制臺打印出來的,這個時候因為我們沒有指定日志文件的輸出,因為不會在工程目錄下生產logs文件夾。
控制臺不打印,直接輸出到日志文件
先來看下配置文件:
<configuration> <!-- 屬性文件:在properties文件中找到對應的配置項 --> <springProperty scope="context" name="logging.path" source="logging.path"/> <springProperty scope="context" name="logging.level" source="logging.level.com.glmapper.spring.boot"/> <!-- 默認的控制臺日志輸出,一般生產環境都是後臺啟動,這個沒太大作用 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>%d{HH:mm:ss.SSS} %-5level %logger{80} - %msg%n</Pattern> </encoder> </appender> <appender name="GLMAPPER-LOGGERONE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>${logging.level}</level> </filter> <file> ${logging.path}/glmapper-spring-boot/glmapper-loggerone.log </file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-loggerone.log.%d{yyyy-MM-dd}</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <root level="info"> <appender-ref ref="GLMAPPER-LOGGERONE"/> </root> </configuration> 複制代碼
這裏我們appender-ref指定的appender是GLMAPPER-LOGGERONE,因為之前沒有名字為GLMAPPER-LOGGERONE的appender,所以要增加一個name為GLMAPPER-LOGGERONE的appender。
注意上面這個配置,我們是直接接將root的appender-ref直接指定到我們的GLMAPPER-LOGGERONE這個appender的。所以控制臺中將只會打印出bannar之後就啥也不打印了,所有的啟動信息都會被打印在日志文件glmapper-loggerone.log中。

編輯切換為居中
添加圖片注釋,不超過 140 字(可選)
但是實際上我們不希望我的業務日志中會包括這些啟動信息。所以這個時候我們就需要通過logger標簽來搞事情了。將上面的配置文件進行簡單修改:
<logger name="com.glmapper.spring.boot.controller" level="${logging.level}" additivity="false"> <appender-ref ref="GLMAPPER-LOGGERONE" /> </logger> <root level="${logging.level}"> <appender-ref ref="STDOUT"/> </root> 複制代碼
讓root指向控制臺輸出;logger負責打印包 com.glmapper.spring.boot.controller下的日志。
驗證結果
還是通過我們的測試controller來打印日志為例,但是這裏不會在控制臺出現日志信息了。期望的日志文件在 ./logs/glmapper-spring-boot/glmapper-loggerone.log。

編輯切換為居中
添加圖片注釋,不超過 140 字(可選)
logger和appender的關系
上面兩種是一個基本的配置方式,通過上面兩個案例,我們先來了解下logger/appender/root之間的關系,然後再詳細的說下logger和appender的配置細節。
在最前面介紹中提到,root是根logger,所以他兩是一回事;只不過root中不能有name和additivity屬性,只有一個level。
appender是一個日志打印的組件,這裏組件裏面定義了打印過濾的條件、打印輸出方式、滾動策略、編碼方式、打印格式等等。但是它僅僅是一個打印組件,如果我們不使用一個logger或者root的appender-ref指定某個具體的appender時,它就沒有什麼意義。
因此appender讓我們的應用知道怎麼打、打印到哪裏、打印成什麼樣;而logger則是告訴應用哪些可以這麼打。例如某個類下的日志可以使用這個appender打印或者某個包下的日志可以這麼打印。
appender 配置詳解
這裏以上面案例中的名為GLMAPPER-LOGGERONE的appender說明:
<appender name="GLMAPPER-LOGGERONE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>${logging.level}</level> </filter> <file> ${logging.path}/glmapper-spring-boot/glmapper-loggerone.log </file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-loggerone.log.%d{yyyy-MM-dd}</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> 複制代碼
appender 有兩個屬性 name和class;name指定appender名稱,class指定appender的全限定名。上面聲明的是名為GLMAPPER-LOGGERONE,class為 ch.qos.logback.core.rolling.RollingFileAppender的一個appender。
appender 的種類
ConsoleAppender:把日志添加到控制臺
FileAppender:把日志添加到文件
RollingFileAppender:滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其他文件。它是FileAppender的子類
append 子標簽
<append>true</append> 複制代碼
如果是 true,日志被追加到文件結尾,如果是false,清空現存文件,默認是true。
filter 子標簽
在簡介中提到了filter;作用就是上面說的。可以為appender 添加一個或多個過濾器,可以用任意條件對日志進行過濾。appender 有多個過濾器時,按照配置順序執行。
ThresholdFilter
臨界值過濾器,過濾掉低於指定臨界值的日志。當日志級別等於或高於臨界值時,過濾器返回NEUTRAL;當日志級別低於臨界值時,日志會被拒絕。
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> 複制代碼
LevelFilter
級別過濾器,根據日志級別進行過濾。如果日志級別等於配置級別,過濾器會根據onMath(用於配置符合過濾條件的操作) 和 onMismatch(用於配置不符合過濾條件的操作)接收或拒絕日志。
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> 複制代碼
關於NEUTRAL、ACCEPT、DENY 見上文簡介中關於filter的介紹。
file 子標簽
file 標簽用於指定被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。
<file> ${logging.path}/glmapper-spring-boot/glmapper-loggerone.log </file> 複制代碼
這個錶示當前appender將會將日志寫入到${logging.path} /glmapper-spring-boot/glmapper-loggerone.log這個目錄下。
rollingPolicy 子標簽
這個子標簽用來描述滾動策略的。這個只有appender的class是RollingFileAppender時才需要配置。這個也會涉及文件的移動和重命名(a.log->a.log.2018.07.22)。
TimeBasedRollingPolicy
最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責觸發滾動。這個下面又包括了兩個屬性:
FileNamePattern
maxHistory
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名:按天回滾 daily --> <FileNamePattern> ${logging.path}/glmapper-spring-boot/glmapper-loggerone.log.%d{yyyy-MM-dd} </FileNamePattern> <!--日志文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> 複制代碼
上面的這段配置錶明每天生成一個日志文件,保存30天的日志文件
FixedWindowRollingPolicy
根據固定窗口算法重命名文件的滾動策略。
encoder 子標簽
對記錄事件進行格式化。他幹了兩件事:
把日志信息轉換成字節數組
把字節數組寫入到輸出流
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> 複制代碼
目前encoder只有PatternLayoutEncoder一種類型。
定義一個只打印error級別日志的appcener
<!-- 錯誤日志 appender : 按照每天生成日志文件 --> <appender name="ERROR-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <!-- 過濾器,只記錄 error 級別的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>error</level> </filter> <!-- 日志名稱 --> <file>${logging.path}/glmapper-spring-boot/glmapper-error.log</file> <!-- 每天生成一個日志文件,保存30天的日志文件 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名:按天回滾 daily --> <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-error.log.%d{yyyy-MM-dd}</FileNamePattern> <!--日志文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d錶示日期,%thread錶示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <!-- 編碼 --> <charset>UTF-8</charset> </encoder> </appender> 複制代碼
定義一個輸出到控制臺的appender
<!-- 默認的控制臺日志輸出,一般生產環境都是後臺啟動,這個沒太大作用 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>%d{HH:mm:ss.SSS} %-5level %logger{80} - %msg%n</Pattern> </encoder> </appender> 複制代碼
logger 配置詳解
<logger name="com.glmapper.spring.boot.controller" level="${logging.level}" additivity="false"> <appender-ref ref="GLMAPPER-LOGGERONE" /> </logger> 複制代碼
上面的這個配置文件描述的是: com.glmapper.spring.boot.controller這個包下的${logging.level}級別的日志將會使用GLMAPPER-LOGGERONE來打印。logger有三個屬性和一個子標簽:
name:用來指定受此logger約束的某一個包或者具體的某一個類。
level:用來設置打印級別(TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF),還有一個值INHERITED或者同義詞NULL,代錶强制執行上級的級別。如果沒有設置此屬性,那麼當前logger將會繼承上級的級別。
addtivity:用來描述是否向上級logger傳遞打印信息。默認是true。
appender-ref則是用來指定具體appender的。
不同日志隔離打印案例
在前面的例子中我們有三種appender,一個是指定包約束的,一個是控制error級別的,一個是控制臺的。然後這小節我們就來實現下不同日志打印到不同的log文件中。
根據包進行日志文件隔離
這個例子裏我們將 com.glmapper.spring.boot.controller中的日志輸出到glmapper-controller.log;將com.glmapper.spring.boot.service中的日志輸出到glmapper-service.log。
<!--打印日志到glmapper-service.log的appender--> <appender name="GLMAPPER-SERVICE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>${logging.level}</level> </filter> <file> ${logging.path}/glmapper-spring-boot/glmapper-service.log </file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-service.log.%d{yyyy-MM-dd}</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!--打印日志到glmapper-controller.log的appender--> <appender name="GLMAPPER-CONTROLLER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>${logging.level}</level> </filter> <file> ${logging.path}/glmapper-spring-boot/glmapper-controller.log </file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-controller.log.%d{yyyy-MM-dd}</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!--此logger約束將.controller包下的日志輸出到GLMAPPER-CONTROLLER,錯誤日志輸出到GERROR-APPENDE;GERROR-APPENDE見上面--> <logger name="com.glmapper.spring.boot.controller" level="${logging.level}" additivity="false"> <appender-ref ref="GLMAPPER-CONTROLLER" /> <appender-ref ref="GERROR-APPENDER" /> </logger> <!--此logger約束將.service包下的日志輸出到GLMAPPER-SERVICE,錯誤日志輸出到GERROR-APPENDE;GERROR-APPENDE見上面--> <logger name="com.glmapper.spring.boot.service" level="${logging.level}" additivity="false"> <appender-ref ref="GLMAPPER-SERVICE" /> <appender-ref ref="GERROR-APPENDER" /> </logger> 複制代碼
來看運行結果
1、glmaper-controller

編輯切換為居中
添加圖片注釋,不超過 140 字(可選)
2、glmapper-service

編輯切換為居中
添加圖片注釋,不超過 140 字(可選)
3、glmapper-error

編輯切換為居中
添加圖片注釋,不超過 140 字(可選)
滿足我們的預期,但是這裏有個小問題。在info日志裏出現了error,當然這是正常的。假如我們不想在info裏面出現error怎麼辦呢?很簡單,我們以APPENDER-SERVICE為例,將filter過濾器進行修改:
將下面的:
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>${logging.level}</level> </filter> 複制代碼
修改為:
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <!-- 如果命中就禁止這條日志 --> <onMatch>DENY</onMatch> <!-- 如果沒有命中就使用這條規則 --> <onMismatch>ACCEPT</onMismatch> </filter> 複制代碼
這裏同時要注意的是,在logger中level需要設置為info級別。
根據類進行日志文件隔離
這個其實也是和上面那個差不過,只不過粒度更細一點,一般情况下比如說我們有個定時任務類需要單獨來記錄其日志信息,這樣我們就可以考慮使用基於類維度來約束打印。
<!--特殊功能單獨appender 例如調度類的日志--> <appender name="SCHEDULERTASKLOCK-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>${logging.level}</level> </filter> <file>${logging.path}/glmapper-spring-boot/scheduler-task-lock.log</file> <!-- 每天生成一個日志文件,保存30天的日志文件 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名:按天回滾 daily --> <FileNamePattern>${logging.path}/glmapper-spring-boot/scheduler-task-lock.log.%d{yyyy-MM-dd}</FileNamePattern> <!--日志文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d錶示日期,%thread錶示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <!-- 編碼 --> <charset>UTF-8</charset> </encoder> </appender> <!--這裏指定到了具體的某一個類--> <logger name="com.glmapper.spring.boot.task.TestLogTask" level="${logging.level}" additivity="true"> <appender-ref ref="SCHEDULERTASKLOCK-APPENDER" /> <appender-ref ref="ERROR-APPENDER" /> </logger> 複制代碼
最終TestLogTask中的日志將會被打印到這個自己獨立的log文件中。如下所示:

編輯切換為居中
添加圖片注釋,不超過 140 字(可選)
根據自定義 logger 的 name 進行日志文件隔離
logger的name除了類、包等約束之外,當然還可以這樣來玩。。。
在進行案例之前,這裏先把前面案例中logger聲明的代碼貼一下,以作對比,以TestLogTask類中的日志為例:
private static final Logger LOGGER = LoggerFactory.getLogger(TestLogTask.class); 複制代碼
在getLogger中我們是將當前對象的class作為參數的,這個是為了打印時獲取其全限定名的(見下面3-)。
1-2018-07-21 11:15:42.003 [pool-1-thread-1] 2-INFO 3-com.glmapper.spring.boot.task.TestLogTask - 4-com.glmapper.spring.boot.task:info 複制代碼
業務類定義
我們同樣是service包下定義一個類TestLogNameServiceImpl
package com.glmapper.spring.boot.service; @Service("testLogNameService") public class TestLogNameServiceImpl implements TestLogNameService { private static final Logger LOGGER = LoggerFactory.getLogger("GLMAPPER-TEST-LOG"); @Override public void print() { LOGGER.info("GLMAPPER-TEST-LOG:this is special logger-----info"); LOGGER.error("GLMAPPER-TEST-LOG:this is special logger-------error"); } } 複制代碼
appender和logger配置
<appender name="ROOT-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>true</append> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>${logging.level}</level> </filter> <file>${logging.path}/glmapper-spring-boot/glmapper-test.log</file> <!-- 每天生成一個日志文件,保存30天的日志文件 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名:按天回滾 daily --> <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-test.log.%d{yyyy-MM-dd} </FileNamePattern> <!--日志文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d錶示日期,%thread錶示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <!-- 編碼 --> <charset>UTF-8</charset> </encoder> </appender> <!--這裏的name和業務類中的getLogger中的字符串是一樣的--> <logger name="GLMAPPER-TEST-LOG" level="${logging.level}" additivity="true"> <appender-ref ref="ROOT-APPENDER" /> <appender-ref ref="ERROR-APPENDER" /> </logger> 複制代碼
我們這個預期的是TestLogNameServiceImpl中的日志不打印到glmapper-service.log中,而是打印到glmapper-test.log中。
1、glmapper-test.log

編輯切換為居中
添加圖片注釋,不超過 140 字(可選)
2、glmapper-service.log

編輯切換為居中
添加圖片注釋,不超過 140 字(可選)
滿足我們的預期。
如何使用logback打印mybatis的sql語句
這個還是比較坑的。為什麼。看下這個:
<settings> <setting name="logImpl" value="slf4j" /> </settings> 複制代碼
在mybatis-configration.xml中,我們通過這樣一個配置項來關聯到具體的日志組件。但是logImpl的實現中是沒有logback的。那麼怎麼辦呢?這裏只能通過slf4j的方式橋接到logback。
然後在我們的logback-spring.xml中進行如下配置:
<!-- 將sql語句輸出到具體的日志文件中 --> <logger name="com.alipay.sofa.cloudplatform.common.dao" level="${logging.sql.level}" additivity="false"> <appender-ref ref="SQL-APPENDER"/> </logger> 複制代碼
這裏有幾個點需要注意的。首先是${logging.sql.level}這個必須是debug,這個是由mybatis本身實現决定的。而這裏的name設定的 com.alipay.sofa.cloudplatform.common.dao值就是我們dao接口的包路徑。
網上看了一個比較典型的案例,這種方式只能輸出到控制臺,並不能將文件輸出到日志文件;它是根據內部的一個實現機制偷了個懶。mybatis用logback日志不顯示sql的解决辦法。
總結
本篇博客主要是整理最近工作中的一些日志配置積累,將每個細節進行總結一下,以作備忘。如果有時間的話會考慮看一個日志框架的源碼。其實我覺得還是很有必要的,日志組件畢竟是需要進行日志文件落盤的,這個會涉及到許多的性能問題、緩沖區問題、隊列問題、當然還有一些鎖的問題、同步打印或者异步打印等問題。有興趣的小夥伴可以看看,然後分享給我們。
後面准備寫一寫螞蟻金服SOFABoot和SpringBoot的一些文章,如果有興趣可以先看一波。
原文鏈接: https://juejin.cn/post/6844903641535479821
边栏推荐
- 教程|fNIRS数据处理工具包Homer2下载与安装
- MySQL进阶——存储引擎
- C语言——printf打印进制前缀
- DTCC2022 中国数据库技术大会最新议程出炉
- After studying this series of notes about software testing, it is a "bonus" to enter the factory
- 元数据管理Apache Atlas编译集成部署及测试
- Key wizard play monster learning - multi window and multi thread background judgment of character, pet blood volume and pet happiness
- 按键精灵打怪学习-多窗口多线程后台技能
- leetcode:232. Realize queue with stack [two stacks, one auxiliary and one simulated queue]
- C# Winfrom Chart图表控件 柱状图、折线图
猜你喜欢
随机推荐
[proteus simulation] nixie tube +4x4 keyboard matrix key simple calculator
What is the strength of a software testing engineer who can get a salary increase twice a year?
BS-GX-018 基于SSM实现在校学生考试系统
Blue Bridge Cup 2015 CA provincial competition (filling the pit)
leetcode:535. Encryption and decryption of tinyurl [mapping of URL and ID, ID self increment]
关于开展2022年江苏省重点领域 首版次软件产品征集工作的通知
按键精灵打怪学习-窗口绑定技能
BOE: with the arrival of the peak season in the second half of the year, the promotion and the release of new products, the demand is expected to improve
Sophon base 3.1 launches mlops function to provide wings for enterprise AI capability operation
GNN笔记:消息传播模型
真正的测试 =“半个产品+半个开发”?
CV5200自组网远程WiFi模组,无人机无线图传应用,高清低时延方案
同样是做测试,为什么别人年薪30W+?
『计组』CPU 如何区分指令和数据
The rooster Electronic Society graphical programming real questions and answers analysis of the scratch grade test level 1 June 2022
Mysql database foundation: DDL data definition language
挖财学堂证券开户安全嘛?
事件相关电位ERP的皮层溯源分析
MySQL基础——多表查询
稳定币风险状况:USDT 和 USDC 安全吗?









