日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

SpringBoot 项目使用 SLF4J+logback 进行日志记录,来增强可维护性

發(fā)布時(shí)間:2025/3/20 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot 项目使用 SLF4J+logback 进行日志记录,来增强可维护性 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
點(diǎn)擊上方?好好學(xué)java?,選擇?星標(biāo)?公眾號(hào)重磅資訊,干貨,第一時(shí)間送達(dá) 今日推薦:推薦19個(gè)github超牛逼項(xiàng)目!個(gè)人原創(chuàng)100W +訪問量博客:點(diǎn)擊前往,查看更多

作者:云深不知處

blog.csdn.net/mu_wind/article/details/99830829

SpringBoot會(huì)默認(rèn)使用logback作為日志框架,在生成springboot項(xiàng)目的時(shí)候可以直接勾選logback,那么就可以直接使用logback了。手動(dòng)添加的話,建議使用slf4j+logback,后面項(xiàng)目更容易維護(hù):

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version> </dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.1.7</version> </dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.7</version> </dependency>

SLF4J 是一個(gè)用于日志系統(tǒng)的簡單Facade,允許最終用戶在部署其應(yīng)用時(shí)使用其所希望的日志系統(tǒng)。大概意思是指你只需要按統(tǒng)一的方式寫記錄日志的代碼,而無需關(guān)心日志是通過哪個(gè)日志系統(tǒng),以什么風(fēng)格輸出的,因?yàn)樗鼈內(nèi)Q于部署項(xiàng)目時(shí)綁定的日志系統(tǒng)。

例如,在項(xiàng)目中使用了 SLF4J 記錄日志,并且綁定了 Log4j(即導(dǎo)入相應(yīng)的依賴),則日志會(huì)以 Log4j 的風(fēng)格輸出;后期需要改為以 Logback 的風(fēng)格輸出日志,只需要將 Log4j 替換成 Logback 即可,不用修改項(xiàng)目中的代碼。

1 快速實(shí)現(xiàn)

假如我們需要實(shí)現(xiàn)這么一個(gè)需求:在文件中記錄調(diào)用接口事件和傳參,并在控制臺(tái)顯示。實(shí)現(xiàn)起來很簡單,三步即可。

第一步,在resource目錄下創(chuàng)建一個(gè)logback.xml文件,內(nèi)部寫入:

<?xml?version='1.0'?encoding='UTF-8'?> <!--日志配置--> <configuration><!--直接定義屬性--><property?name="logFile"?value="logs/mutest"/><property?name="maxFileSize"?value="30MB"/><!--控制臺(tái)日志--><appender?name="STDOUT"?class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d?[%thread]?%-5level?%logger{50}?-[%file:%line]-?%msg%n</pattern><charset>UTF-8</charset></encoder></appender><!--滾動(dòng)文件日志--><appender?name="fileLog"?class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${logFile}.log</file><encoder><!--日志輸出格式--><pattern>%d?[%thread]?%-5level?-[%file:%line]-?%msg%n</pattern><charset>UTF-8</charset></encoder><rollingPolicy?class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${logFile}.%d{yyyy-MM-dd}.%i.log</fileNamePattern><maxFileSize>${maxFileSize}</maxFileSize></rollingPolicy></appender><!--創(chuàng)建一個(gè)具體的日志輸出--><logger?name="com.mutest"?level="info"?additivity="true"><!--可以有多個(gè)appender-ref,即將日志記錄到不同的位置--><appender-ref?ref="STDOUT"/><appender-ref?ref="fileLog"/></logger><!--基礎(chǔ)的日志輸出--><root?level="info"></root> </configuration>

關(guān)于這段xml的詳情,第二章節(jié)會(huì)詳細(xì)講解

第二步,在application.yml文件中配置項(xiàng)目要使用的日志配置文件路徑:

logging:config:?classpath:logback.xml

第三步,在接口添加日志記錄:

import?org.slf4j.Logger; import?org.slf4j.LoggerFactory; import?org.springframework.web.bind.annotation.RequestMapping; import?org.springframework.web.bind.annotation.RequestMethod; import?org.springframework.web.bind.annotation.RestController;@RestController public?class?TestController?{//?getLogger()的入?yún)⑹钱?dāng)前類,否則輸出日志的類名會(huì)是錯(cuò)誤的private?final?Logger?logger?=?LoggerFactory.getLogger(TestController.class);@RequestMapping(value?=?"/test",?method?=?RequestMethod.GET)public?String?logTest(String?name,?String?age)?{logger.info("logTest,name:{},age:{}",?name,?age);return?"success";} }

當(dāng)然,如果你安裝了lombok這個(gè)插件,就更簡單了:

https://blog.csdn.net/mu_wind/article/details/104844946

import?lombok.extern.slf4j.Slf4j; import?org.springframework.web.bind.annotation.RequestMapping; import?org.springframework.web.bind.annotation.RequestMethod; import?org.springframework.web.bind.annotation.RestController;@RestController @Slf4j public?class?TestController?{@RequestMapping(value?=?"/test",?method?=?RequestMethod.GET)public?String?logTest(String?name,?String?age)?{log.info("logTest,name:{},age:{}",?name,?age);return?"success";} }

啟動(dòng)項(xiàng)目后調(diào)用接口,控制臺(tái)輸出如我們所期望:

同時(shí),項(xiàng)目中增加了一個(gè)log目錄,生成mutest.log文件,里面記錄了日志:


功能是實(shí)現(xiàn)了,但我們腦子里還是有很多小問號(hào),不急,接下來就細(xì)細(xì)講來。

2 配置xml

首先,在resource目錄下創(chuàng)建一個(gè)文件,命名為logback.xml。現(xiàn)在先向里面寫一些固定的內(nèi)容,就是下面這個(gè)樣子:

<?xml?version='1.0'?encoding='UTF-8'?> <!--日志配置--> <configuration><!--直接定義屬性--><property?name=""?value=""/><!--通過配置文件定義屬性--><springProperty?name=""?source=""/><!--定義并描述一個(gè)日志的輸出屬性--><appender?name=""?class=""></appender><!--創(chuàng)建一個(gè)具體的日志輸出--><logger?name=""?level=""?additivity=""><appender-ref?ref=""/></logger><!--基礎(chǔ)的日志輸出--><root?level=""><appender-ref?ref=""/></root> </configuration> 在這里插入圖片描述

2.1 configuration

<configuration>是logback.xml這個(gè)xml文件的根節(jié)點(diǎn),它包含以下屬性:

  • scan:當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true。

  • scanPeriod:設(shè)置監(jiān)測配置文件是否有修改的時(shí)間間隔,如果沒有給出時(shí)間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。

  • debug:當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。

  • 例如,下面這個(gè)configuration:

    <configuration?scan="true"?scanPeriod="60?seconds"?debug="false">??<!--?其他配置省略-->?? </configuration>??

    2.2 property和springProperty

    這兩個(gè)節(jié)點(diǎn)可以設(shè)置全局變量。

    property可以直接設(shè)置,例如:

    <property?name="logFile"?value="logs/mutest"/>

    這樣就設(shè)置了一個(gè)名為logFile的變量,后續(xù)通過${logFile}的方式就引用到了其值logs/mutest。

    而springProperty則要配合配置文件,例如:

    <springProperty?name="logFile"?source="log.file"/>

    也是設(shè)置了一個(gè)名為logFile的變量,但沒有直接賦值,而是通過source指向了配置文件的路徑,配置文件中是這樣的:

    log:file:?logs/mutest

    2.3 root

    root節(jié)點(diǎn),必選節(jié)點(diǎn),用來指定最基礎(chǔ)的日志輸出級(jí)別并指定<appender>,可以理解為根logger。

    一個(gè)典型的root節(jié)點(diǎn)如下:

    <root?level="debug"><appender-ref?ref="console"?/><appender-ref?ref="file"?/> </root>

    2.4 appender

    appender節(jié)點(diǎn)是非常關(guān)鍵的一個(gè)節(jié)點(diǎn),負(fù)責(zé)格式化一個(gè)日志輸出節(jié)點(diǎn)(也就是描述日志存儲(chǔ)類型、位置、滾動(dòng)規(guī)則等屬性)。我個(gè)人理解,appender作用類似于構(gòu)造一個(gè)日志模板,而logger是真正的日志輸出者,使用某個(gè)appender作為模板去寫日志。

    appender有三種類型,分別是ConsoleAppender(控制臺(tái)日志)、FileAppender(文件日志)、RollingFileAppender(滾動(dòng)文件日志)。

    搜索Java知音公眾號(hào),回復(fù)“后端面試”,送你一份Java面試題寶典.pdf

    2.4.1 ConsoleAppender

    ConsoleAppender的作用是將日志輸出到控制臺(tái),一般在本地調(diào)試時(shí)使用,它的配置非常簡單,一個(gè)典型的ConsoleAppender如下:

    <appender?name="STDOUT"?class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d?[%thread]?%-5level?%logger{50}?-[%file:%line]-?%msg%n</pattern><charset>UTF-8</charset></encoder> </appender>

    appender?有name和class兩個(gè)屬性:

    • name:appender節(jié)點(diǎn)的名稱,在后文中被logger節(jié)點(diǎn)引用。一個(gè)logback配置文件中不能有重復(fù)的appender name。

    • class:使用何種日志輸出策略,分別是ConsoleAppender(控制臺(tái)日志)、FileAppender(文件日志)、RollingFileAppender(滾動(dòng)文件日志)。

    2.4.2 FileAppender

    FileAppender用于把日志添加到文件。一個(gè)典型的FileAppender如下:

    <appender?name="FILE"?class="ch.qos.logback.core.FileAppender">?<file>testFile.log</file>?<append>true</append>?<encoder>?<pattern>%-4relative?[%thread]?%-5level?%logger{35}?-?%msg%n</pattern>?</encoder> </appender>?

    相對(duì)于ConsoleAppender,它多了一些子節(jié)點(diǎn),讓我們一一來看:

    • <file>:被寫入的文件名,可以是相對(duì)目錄,也可以是絕對(duì)目錄,如果上級(jí)目錄不存在會(huì)自動(dòng)創(chuàng)建,沒有默認(rèn)值。

    • <append>:如果是?true,日志被追加到文件結(jié)尾,如果是?false,清空現(xiàn)存文件,默認(rèn)是true。

    • <encoder>:對(duì)記錄事件進(jìn)行格式化。(具體參數(shù)稍后講解 )

    • <prudent>:如果是?true,日志會(huì)被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認(rèn)是?false。

    • <pattern>:日志的輸出格式。

    pattern定義了日志的輸出格式,我們以<pattern>%d [%thread] %-5level -[%file:%line]- %msg%n</pattern>為例,分解開來:

  • %date:表示日期

  • %thread:表示線程名

  • %-5level:表示級(jí)別從左顯示 5 個(gè)字符寬度

  • %logger{50}:表示 Logger 名字最長 50 個(gè)字符

  • %msg:表示日志消息

  • %n:換行符

  • 2.4.3 RollingFileAppender

    RollingFileAppender用于滾動(dòng)記錄文件,先將日志記錄到指定文件,當(dāng)符合某個(gè)條件時(shí),將日志記錄到其他文件。一個(gè)典型的RollingFileAppender節(jié)點(diǎn)如下:

    <configuration><!--直接定義屬性--><property?name="logFile"?value="logs/mutest"/><property?name="maxFileSize"?value="30MB"/><appender?name="fileLog"?class="ch.qos.logback.core.rolling.RollingFileAppender"><!--日志文件存儲(chǔ)路徑,來自property設(shè)置--><file>${logFile}.log</file><encoder><pattern>%d?[%thread]?%-5level?-[%file:%line]-?%msg%n</pattern><charset>UTF-8</charset></encoder><rollingPolicy?class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--每天生成一個(gè)新的活動(dòng)日志文件,舊的日志歸檔,后綴名為2019.08.12這種格式--><fileNamePattern>${logFile}.%d{yyyy-MM-dd}.%i.log</fileNamePattern><!--活動(dòng)日志文件最大值,超過這個(gè)值將產(chǎn)生新日志文件--><maxFileSize>${maxFileSize}</maxFileSize><!--只保留最近30天的日志--><maxHistory>30</maxHistory><!--用來指定日志文件的上限大小,那么到了這個(gè)值,就會(huì)刪除舊的日志--><totalSizeCap>1GB</totalSizeCap></rollingPolicy><!--用來指定日志文件的上限大小,那么到了這個(gè)值,就會(huì)刪除舊的日志--><filter?class="ch.qos.logback.classic.filter.LevelFilter"><level>error</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender> </configuration>

    另外,RollingFileAppender節(jié)點(diǎn)下有一些常用的子節(jié)點(diǎn):

    • <rollingPolicy>:當(dāng)發(fā)生滾動(dòng)時(shí),決定 RollingFileAppender 的行為,涉及文件移動(dòng)和重命名。

    • <filter>:日志輸出攔截器,可以自定義攔截器也可以用系統(tǒng)一些定義好的攔截器。

    • <rollingPolicy>:當(dāng)發(fā)生滾動(dòng)時(shí),決定RollingFileAppender的行為,涉及文件移動(dòng)和重命名。屬性class定義具體的滾動(dòng)策略類。

  • SizeAndTimeBasedRollingPolicy:根據(jù)日志文件大小和時(shí)間周期作為切分條件,滿足其中任意一個(gè)就要做切分。maxFileSize的值決定了當(dāng)天的日志文件大小上限,超過這個(gè)上限,同一天將會(huì)有多個(gè)日志文件,因此<fileNamePattern>${logFile}.%d{yyyy-MM-dd}.%i</fileNamePattern>中有一個(gè)%i,就是為應(yīng)對(duì)同一天生成多個(gè)日志文件而寫,在日志量很大的情況下,會(huì)出現(xiàn)mutest.log.2020-07-28.0.log、mutest.2020-07-28.1.log這種情況。

  • TimeBasedRollingPolicy:只以時(shí)間周期為切分條件,在這種策略下,存檔日志名稱格式設(shè)置為<fileNamePattern>${logFile}.%d{yyyy-MM-dd}.log</fileNamePattern>即可。

  • SizeBasedTriggeringPolicy:只以文件大小為切分條件,在這種策略下,<maxFileSize>日志滾動(dòng)的唯一觸發(fā)條件。

    • <fileNamePattern>:必要節(jié)點(diǎn)。以${logFile}.%d{yyyy-MM-dd}.%i.log為例(mutest.2019-07-28.0.log),有這么幾個(gè)部分:

  • ${logFile}:固定文件名稱前綴,這里是引用了<property>中設(shè)置的變量。

  • %d{yyyy-MM}:指定日志名稱中間日期的格式,如果只有%d,將默認(rèn)使用yyyy-MM-dd格式。

  • %i:當(dāng)日志量過大,導(dǎo)致同一天生成兩個(gè)及以上日志文件時(shí),這個(gè)屬性將為日志名稱加一個(gè)索引作為后綴,以加以區(qū)分。

  • .log.zip:指定存檔日志文件的壓縮格式。

  • 還有幾個(gè)屬性,要根據(jù)滾動(dòng)策略去添加:

    • <maxFileSize>:這是活動(dòng)文件的大小,SizeAndTimeBasedRollingPolicy策略和SizeBasedTriggeringPolicy策略下必須有。默認(rèn)值是10MB。超過這個(gè)大小,就要生成新的活動(dòng)文件了。

    • <maxHistory>:可選節(jié)點(diǎn),控制保留的歸檔文件的最大數(shù)量,超出數(shù)量就刪除舊文件。假設(shè)設(shè)置每個(gè)月滾動(dòng),且<maxHistory>是6,則只保存最近6個(gè)月的文件,刪除之前的舊文件。注意,刪除舊文件是,那些為了歸檔而創(chuàng)建的目錄也會(huì)被刪。

    • <totalSizeCap>:可選節(jié)點(diǎn),表示日志文件總大小超過1GB將刪除存檔日志文件。

    2.5 logger

    logger節(jié)點(diǎn),可選節(jié)點(diǎn),作用是指明具體的包或類的日志輸出級(jí)別,以及要使用的<appender>(可以把<appender>理解為一個(gè)日志模板)。

    一個(gè)典型的logger節(jié)點(diǎn)如下:

    <!--?name?屬性表示匹配的logger類型前綴?-->?? <logger?name="com.mutest.demo">??<level?value="INFO"?/>??<!--?引用的appender,類似于spring的ref?-->??<appender-ref?ref="fileLog"?/>??<appender-ref?ref="STDOUT"?/>? </logger>??
  • name:必寫屬性,指定具體包或類,被指定的包或類中的日志輸出將遵從該logger規(guī)定配置。

  • level:非必寫屬性,指定日志輸出級(jí)別,該級(jí)別將覆蓋root配置的輸出級(jí)別。

  • addtivity:非必寫屬性,是否向上級(jí)loger傳遞打印信息。默認(rèn)是true。

  • appender-ref:引用的appender,引用后將實(shí)現(xiàn)appender中定義的行為,例如上面示例中引用了fileLog這個(gè)appender,那么com.mutest.demo中打印的日志將按fileLog的配置進(jìn)行記錄。一個(gè)logger可以有多個(gè)引用,互不影響。

  • 3 更多情形

    3.1 日志級(jí)別

    logback有5種級(jí)別,分別是TRACE < DEBUG < INFO < WARN < ERROR,定義于ch.qos.logback.classic.Level類中。

    • Trace:是追蹤,就是程序推進(jìn)一下,你就可以寫個(gè)trace輸出,所以trace應(yīng)該會(huì)特別多,一般不會(huì)設(shè)置到這個(gè)級(jí)別。

    • Debug:指出細(xì)粒度信息事件對(duì)調(diào)試應(yīng)用程序是非常有幫助的。

    • Info:消息在粗粒度級(jí)別上突出強(qiáng)調(diào)應(yīng)用程序的運(yùn)行過程。

    • Warn:輸出警告及warn以上級(jí)別的日志。

    • Error:輸出錯(cuò)誤信息日志.

    此外OFF表示關(guān)閉全部日志,ALL表示開啟全部日志。

    那么,在logback中,日志級(jí)別如何設(shè)置呢?

    首先,<root>中可以設(shè)置日志級(jí)別,如果不設(shè)置,root logger默認(rèn)級(jí)別是DEBUG。

    ?<root?level="info"></root>

    其次,logger中可以設(shè)置日志級(jí)別,設(shè)置后將覆蓋<root>的設(shè)置,不設(shè)置將繼承<root>的日志級(jí)別

    <logger?name="com.mutest"?level="error"?additivity="false"><appender-ref?ref="STDOUT"/><appender-ref?ref="fileLog"/> </logger>

    另外,還可以在配置文件中設(shè)置更加具體的日志級(jí)別,例如將com.mutest.controller包下所有的日志輸出級(jí)別設(shè)置為info,那么即使logger中,設(shè)置為error級(jí)別,日志仍然輸出。

    logging:config:?classpath:logback.xmllevel:com.mutest.controller:?info

    3.2 日志滾動(dòng)

    如果不設(shè)置日志滾動(dòng)策略,那么會(huì)一直向一個(gè)文件中追加日志,日志文件會(huì)越來越大,想要查找有用信息會(huì)很慢,而且有占滿磁盤的風(fēng)險(xiǎn)。所以,我們要設(shè)置滾動(dòng)策略,即滿足一定條件,生成一個(gè)新文件,而舊日志文件進(jìn)行歸檔。

    搜索Java知音公眾號(hào),回復(fù)“后端面試”,送你一份Java面試題寶典.pdf

    3.2.1 時(shí)間策略

    以時(shí)間周期為切分條件,<rollingPolicy>的class要設(shè)置為ch.qos.logback.core.rolling.TimeBasedRollingPolicy,一個(gè)典型示例(每天生成一個(gè)日志文件,保存30天的日志文件)如下:

    <configuration>?<appender?name="FILE"?class="ch.qos.logback.core.rolling.RollingFileAppender">?<rollingPolicy?class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">?<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>?<maxHistory>30</maxHistory></rollingPolicy>?<encoder>?<pattern>%-4relative?[%thread]?%-5level?%logger{35}?-?%msg%n</pattern>?</encoder>?</appender>?<root?level="DEBUG">?<appender-ref?ref="FILE"?/>?</root>? </configuration>

    3.2.2 文件大小策略

    以文件大小為切分條件,<rollingPolicy>的class要設(shè)置為ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy,一個(gè)典型示例(活動(dòng)日志文件大小超過30M則生成新的活動(dòng)日志文件)如下:

    <configuration>?<appender?name="FILE"?class="ch.qos.logback.core.rolling.RollingFileAppender">?<rollingPolicy?class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">?<fileNamePattern>logFile.%d{yyyy-MM-dd}.%i.log</fileNamePattern>??<maxFileSize>30MB</maxFileSize></rollingPolicy>?<encoder>?<pattern>%-4relative?[%thread]?%-5level?%logger{35}?-?%msg%n</pattern>?</encoder>?</appender>?<root?level="DEBUG">?<appender-ref?ref="FILE"?/>?</root>? </configuration>

    要注意的是,<fileNamePattern>中,%i必須要有,如果同一天產(chǎn)生多個(gè)歸檔日志文件,%i會(huì)產(chǎn)生一個(gè)后綴加以區(qū)分。例如mutest.2019-07-28.0.log?和?mutest.2019-07-28.1.log。

    3.2.3 時(shí)間與文件大小策略

    根據(jù)日志文件大小和時(shí)間周期作為切分條件,滿足其中任意一個(gè)就要做切分。<rollingPolicy>的class要設(shè)置為ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy,一個(gè)典型示例如下:

    <configuration>?<appender?name="fileLog"?class="ch.qos.logback.core.rolling.RollingFileAppender"><file>mutest.log</file><encoder><pattern>%d?[%thread]?%-5level?-[%file:%line]-?%msg%n</pattern><charset>UTF-8</charset></encoder><rollingPolicy?class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${logFile}.%d{yyyy-MM-dd}.%i.log</fileNamePattern><maxFileSize>${maxFileSize}</maxFileSize></rollingPolicy></appender><root?level="DEBUG">?<appender-ref?ref="FILE"?/>?</root>? </configuration>

    同樣,<fileNamePattern>中必須有%i。

    3.3 日志過濾

    首先,了解一下,日志級(jí)別從低到高分為:

    TRACE?<?DEBUG?<?INFO?<?WARN?<?ERROR?<?FATAL

    有時(shí)候,我們需要對(duì)日志進(jìn)行過濾,logback提供了多種過濾規(guī)則的實(shí)現(xiàn)。

    3.3.1 LevelFilter

    比如說,日志級(jí)別為info以上,但我們不想打印warn類型的日志,那么按照下面的配置做:

    <filter?class="ch.qos.logback.classic.filter.LevelFilter"><level>warn</level><onMatch>DENY</onMatch><onMismatch>ACCEPT</onMismatch> </filter>

    幾個(gè)參數(shù)的含義:

    • ch.qos.logback.classic.filter.LevelFilter:過濾規(guī)則。這里是根據(jù)日志級(jí)別進(jìn)行匹配。

    • level:要匹配的日志級(jí)別。

    • <onMatch>DENY</onMatch>:匹配到的日志會(huì)被拒絕。

    • <onMismatch>ACCEPT</onMismatch>:未匹配到的日志會(huì)被打印。

    3.3.2 ThresholdFilter

    除了?ch.qos.logback.classic.filter.LevelFilter外,還有一種過濾策略:ThresholdFilter。即臨界值過濾器,過濾掉低于指定臨界值的日志。當(dāng)日志級(jí)別等于或高于臨界值時(shí),過濾器返回NEUTRAL;當(dāng)日志級(jí)別低于臨界值時(shí),日志會(huì)被拒絕。

    比如,設(shè)置只打印info級(jí)別以上的日志:

    <filter?class="ch.qos.logback.classic.filter.ThresholdFilter"><level>info</level> </filter>

    3.3.3 EvaluatorFilter

    EvaluatorFilter是求值過濾器,評(píng)估、鑒別日志是否符合指定條件。

    <filter?class="ch.qos.logback.core.filter.EvaluatorFilter">?????????<evaluator>?<!--?默認(rèn)為?ch.qos.logback.classic.boolex.JaninoEventEvaluator?-->???<expression>return?message.contains("success");</expression></evaluator>???<OnMatch>ACCEPT</OnMatch>??<OnMismatch>DENY</OnMismatch>?? </filter>???

    屬性釋義:

    • <evaluator>:鑒別器,常用的鑒別器是JaninoEventEvaluato,也是默認(rèn)的鑒別器,它以任意的Java布爾值表達(dá)式作為求值條件,求值條件在配置文件解釋過成功被動(dòng)態(tài)編譯,布爾值表達(dá)式返回true就表示符合過濾條件。evaluator有個(gè)子標(biāo)簽<expression>,用于配置求值條件。

    • <onMatch>:用于配置符合過濾條件的操作,ACCEPT或DENY

    • <onMismatch>:用于配置不符合過濾條件的操作,ACCEPT或DENY

    3.4 與配置文件結(jié)合

    Spring Boot項(xiàng)目的配置文件有 application.properties 文件和 application.yml 文件兩種,而我個(gè)人比較喜歡用 yml 文件。

    application.yml 文件中對(duì)日志的配置:

    logging:config:?logback.xmllevel:com.example.demo.dao:?trace
  • logging.config 用來指定項(xiàng)目啟動(dòng)的時(shí)候,讀取哪個(gè)配置文件,這里指定的日志配置文件是根路徑下的 logback.xml 文件。關(guān)于日志的相關(guān)配置信息,都放在了 logback.xml 文件中。

  • logging.level 用來指定具體的 Mapper 中日志的輸出級(jí)別,上面的配置表示 com.example.demo.dao 包下的所有 Mapper 日志輸出級(jí)別為 Trace,會(huì)將操作數(shù)據(jù)庫的 SQL 打印出來。開發(fā)時(shí)設(shè)置成 trace 方便定位問題,在生產(chǎn)環(huán)境上,將這個(gè)日志級(jí)別再設(shè)置成 error 級(jí)別即可。

  • 常用的日志級(jí)別按照從高到低依次為:ERROR、WARN、INFO、DEBUG。

  • 推薦文章
    • 面試官問:前后端分離項(xiàng)目,有什么優(yōu)缺點(diǎn)?我說:沒

    • 2020 年騰訊新增 20 億行代碼,鵝廠第一編程語言還是它

    • 通俗講解分布式鎖,看完不懂算我輸

    • 寫博客能月入10K?

    • 一款基于 Spring Boot 的現(xiàn)代化社區(qū)(論壇/問答/社交網(wǎng)絡(luò)/博客)

    更多項(xiàng)目源碼
    • 這或許是最美的Vue+Element開源后臺(tái)管理UI

    • 推薦一款高顏值的 Spring Boot 快速開發(fā)框架

    • 一款基于 Spring Boot 的現(xiàn)代化社區(qū)(論壇/問答/社交網(wǎng)絡(luò)/博客)

    • 13K點(diǎn)贊都基于 Vue+Spring 前后端分離管理系統(tǒng)ELAdmin,大愛

    • 想接私活時(shí)薪再翻一倍,建議根據(jù)這幾個(gè)開源的SpringBoot項(xiàng)目

    總結(jié)

    以上是生活随笔為你收集整理的SpringBoot 项目使用 SLF4J+logback 进行日志记录,来增强可维护性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。