SpringBoot整合logback日志的詳細(xì)步驟
一、概述
與log4j相比:
實(shí)際上,這兩個(gè)日志框架都出自同一個(gè)開發(fā)者之手,Logback 相對(duì)于 Log4J 有更多的優(yōu)點(diǎn)
(1)logback不僅性能提升了,初始化內(nèi)存加載也更小了。
(2)內(nèi)容更豐富的文檔
(3)更強(qiáng)大的過濾器
二、步驟
1、maven配置jar包
logback默認(rèn)就在spring-boot-starter-web包中,所以我們只要有spring-boot-starter-web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、新建logback-spring.xml
springboot官方建議命名為logback-spring.xml,在src/main/resources新建logback-spring.xml,這里不需要在application.properties中配置
默認(rèn)加載加載配置順序 logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 打印到控制臺(tái) -->
<appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</layout>
</appender>
<!-- 打印到文件 -->
<appender name="fileInfoApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</encoder>
<!-- 滾動(dòng)策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 路徑 -->
<fileNamePattern>app_log/log/app.info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!-- 打印到文件 -->
<appender name="fileErrorApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</encoder>
<!-- 設(shè)置滾動(dòng)策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 路徑,因?yàn)橛?%d所以每天都會(huì)意時(shí)間來創(chuàng)建新的文件 -->
<fileNamePattern>app_log/log/app.err.%d.log</fileNamePattern>
<!-- 控制保留的歸檔文件的最大數(shù)量,超出數(shù)量就刪除舊文件,假設(shè)設(shè)置每個(gè)月滾動(dòng),
且<maxHistory> 是1,則只保存最近1個(gè)月的文件,刪除之前的舊文件 -->
<MaxHistory>1</MaxHistory>
<!-- 保持30天的歷史記錄上限為3GB總大小 -->
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
</appender>
<!--這里選擇INFO就代表,進(jìn)行INFO級(jí)別輸出記錄,那么在控制臺(tái)也好,log文件也好只記錄INFO及以上級(jí)別的日志,這里相當(dāng)于第一道過濾器-->
<root level="INFO">
<appender-ref ref="consoleApp"/>
<appender-ref ref="fileInfoApp"/>
<appender-ref ref="fileErrorApp"/>
</root>
</configuration>有關(guān)配置文件詳細(xì)介紹放到下面講,這里先跳過
3、controller類
@RestController
@RequestMapping("/api/v1")
public class UserController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@GetMapping("log")
public Object testLog(){
logger.debug("---debug---debug---");
logger.info("---info---信息---");
logger.warn("---warn ---警告--- ");
logger.error("---err---錯(cuò)誤---");
//這也是個(gè)錯(cuò)誤的日志級(jí)別
int i=1/0;
return "yes";
}
}4、效果:

我們發(fā)現(xiàn),在項(xiàng)目中自動(dòng)創(chuàng)建app_log/log/app.info(當(dāng)天日期).log和app.err(當(dāng)天日期).log文件
然后我們看

它只存放err級(jí)別日志

它只存放的info和warn兩種基本日志,這是為什么呢?詳細(xì)介紹下配置文件
三、配置文件介紹
1、根節(jié)點(diǎn)
它的三個(gè)子節(jié)點(diǎn)
(1) 格式化日志輸出節(jié)點(diǎn),有兩個(gè)必要屬性name和class。
(2) 用來設(shè)置某一個(gè)包或具體的某一個(gè)類的日志打印級(jí)別、以及指定。
(3)(要加在最后)(必選,而且只有一個(gè))(用來指定最基礎(chǔ)的日志輸出級(jí)別,他有倆個(gè)自己點(diǎn)可以用來應(yīng)用appender,格式化日志輸出)
2、appender節(jié)點(diǎn)
它有兩個(gè)屬性name和class (1) class="ch.qos.logback.core.ConsoleAppender":把日志輸出到 (2)class="ch.qos.logback.core.FileAppender":把日志添加到文件 (3)class="ch.qos.logback.core.rolling.RollingFileAppender":滾動(dòng)記錄文件,先將日志文件指定到文件,當(dāng)符合某個(gè)條件時(shí),將日志記錄到其他文件
所以上面第一個(gè)appender代表輸出到控制臺(tái),同時(shí)并沒有進(jìn)行任何過濾,所以只要是INFO級(jí)別以上的都會(huì)在控制臺(tái)輸出。
四、filter過濾器
其它的一看就懂,就這里,一開始一直想不明白,為什么上面的info文件里只有info和warn,而err文件中只有err日志。后來明白了。
他有幾個(gè)常用的過濾器
(1)LevelFilter 過濾器
級(jí)別過濾器,根據(jù)日志級(jí)別進(jìn)行過濾。如果日志級(jí)別等于配置級(jí)別,過濾器會(huì)根據(jù)onMath 和 onMismatch接收或拒絕日志。
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>< level>:設(shè)置過濾級(jí)別
將過濾器的日志級(jí)別配置為ERROR,所有ERROR級(jí)別的日志交給appender處理,非ERROR級(jí)別的日志,被過濾掉。
(這樣的話那上面不是只顯示ERROR日志,怎么最后顯示的是INFO和WARN日志呢?看下面)
< onMatch>: 用于配置符合過濾條件的操作
< onMismatch>:用于配置不符合過濾條件的操作
再看有這么幾個(gè)單詞DENY(拒絕),NEUTRAL(中性),ACCEPT(接受)
(1)返回DENY,日志將立即被拋棄不再經(jīng)過其他過濾器; (2)返回NEUTRAL,有序列表里的下個(gè)過濾器過接著處理日志; (3)返回ACCEPT,日志會(huì)被立即處理,不再經(jīng)過剩余過濾器
在理解下:
<level>ERROR</level> <!-- 所有ERROR級(jí)別的日志交給appender處理,非ERROR級(jí)別的日志,被過濾掉 --> <onMatch>DENY</onMatch> <!-- 代表符合過濾條件的拒絕輸出 --> <onMismatch>ACCEPT</onMismatch> <!-- 不符合過濾條件的接受輸出 -->
我靠,這么繞一圈不還是表示非ERROR級(jí)別的輸出嘛,DEBUG除外,因?yàn)镈UBUG在root標(biāo)簽,已經(jīng)過濾掉,都不會(huì)走到appender標(biāo)簽這里
(2)ThresholdFilter 過濾器
臨界值過濾器,過濾掉低于指定臨界值的日志。當(dāng)日志級(jí)別等于或高于臨界值時(shí),過濾器返回NEUTRAL;當(dāng)日志級(jí)別低于臨界值時(shí),日志會(huì)被拒絕。
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>這里只會(huì)訪問ERROR及以上級(jí)別的過濾器,而ERROR已經(jīng)是最高級(jí)了,所以就只顯示ERROR日志在errer文件中了,所以一切都通了。
到此這篇關(guān)于SpringBoot整合logback日志的文章就介紹到這了,更多相關(guān)SpringBoot整合logback內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis使用annonation定義類型映射的簡(jiǎn)易用法示例
這篇文章主要介紹了MyBatis使用annonation定義類型映射的簡(jiǎn)易用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Java實(shí)現(xiàn)五子棋游戲單機(jī)版(1.0)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)五子棋游戲單機(jī)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
java 網(wǎng)絡(luò)編程之TCP通信和簡(jiǎn)單的文件上傳功能實(shí)例
下面小編就為大家分享一篇java 網(wǎng)絡(luò)編程之TCP通信和簡(jiǎn)單的文件上傳功能實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
springboot starter介紹與自定義starter示例詳解
Spring Boot 的 Starter 是一組比較方便的依賴描述符,可以通過 Maven 將其打成jar包,并在你的項(xiàng)目中直接引用,這篇文章主要介紹了springboot starter介紹與自定義starter示例,需要的朋友可以參考下2025-05-05
MyBatis?Generator生成的$?sql是否存在注入風(fēng)險(xiǎn)詳解
這篇文章主要介紹了MyBatis?Generator生成的$?sql是否存在注入風(fēng)險(xiǎn)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java冒泡排序(Bubble Sort)實(shí)例講解
冒泡排序的原理:假設(shè)要求的數(shù)組是正序,兩兩進(jìn)行比較,如果前一個(gè)書比后一個(gè)數(shù)小,位置不變。如果前一個(gè)數(shù)比后一個(gè)數(shù)大,位置互換,再跟后一個(gè)數(shù)進(jìn)行比較,直到最后。就是逐步把大數(shù)送到最后,下面來個(gè)實(shí)例給大家看看2013-11-11
java防盜鏈在報(bào)表中的應(yīng)用實(shí)例(推薦)
下面小編就為大家?guī)硪黄猨ava防盜鏈在報(bào)表中的應(yīng)用實(shí)例(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
SpringController返回值和異常自動(dòng)包裝的問題小結(jié)
今天遇到一個(gè)需求,在不改動(dòng)原系統(tǒng)代碼的情況下,將Controller的返回值和異常包裝到一個(gè)統(tǒng)一的返回對(duì)象中去,下面通過本文給大家介紹SpringController返回值和異常自動(dòng)包裝的問題,需要的朋友可以參考下2024-03-03

