SpringBoot整合logback日志的詳細步驟
一、概述
與log4j相比:
實際上,這兩個日志框架都出自同一個開發(fā)者之手,Logback 相對于 Log4J 有更多的優(yōu)點
(1)logback不僅性能提升了,初始化內(nèi)存加載也更小了。
(2)內(nèi)容更豐富的文檔
(3)更強大的過濾器
二、步驟
1、maven配置jar包
logback默認就在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中配置
默認加載加載配置順序 logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <!-- 打印到控制臺 --> <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> <!-- 滾動策略 --> <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è)置滾動策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 路徑,因為有 %d所以每天都會意時間來創(chuàng)建新的文件 --> <fileNamePattern>app_log/log/app.err.%d.log</fileNamePattern> <!-- 控制保留的歸檔文件的最大數(shù)量,超出數(shù)量就刪除舊文件,假設(shè)設(shè)置每個月滾動, 且<maxHistory> 是1,則只保存最近1個月的文件,刪除之前的舊文件 --> <MaxHistory>1</MaxHistory> <!-- 保持30天的歷史記錄上限為3GB總大小 --> <totalSizeCap>3GB</totalSizeCap> </rollingPolicy> </appender> <!--這里選擇INFO就代表,進行INFO級別輸出記錄,那么在控制臺也好,log文件也好只記錄INFO及以上級別的日志,這里相當(dāng)于第一道過濾器--> <root level="INFO"> <appender-ref ref="consoleApp"/> <appender-ref ref="fileInfoApp"/> <appender-ref ref="fileErrorApp"/> </root> </configuration>
有關(guān)配置文件詳細介紹放到下面講,這里先跳過
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---錯誤---"); //這也是個錯誤的日志級別 int i=1/0; return "yes"; } }
4、效果:
我們發(fā)現(xiàn),在項目中自動創(chuàng)建app_log/log/app.info(當(dāng)天日期).log和app.err(當(dāng)天日期).log文件
然后我們看
它只存放err級別日志
它只存放的info和warn兩種基本日志,這是為什么呢?詳細介紹下配置文件
三、配置文件介紹
1、根節(jié)點
它的三個子節(jié)點
(1) 格式化日志輸出節(jié)點,有兩個必要屬性name和class。
(2) 用來設(shè)置某一個包或具體的某一個類的日志打印級別、以及指定。
(3)(要加在最后)(必選,而且只有一個)(用來指定最基礎(chǔ)的日志輸出級別,他有倆個自己點可以用來應(yīng)用appender,格式化日志輸出)
2、appender節(jié)點
它有兩個屬性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)符合某個條件時,將日志記錄到其他文件
所以上面第一個appender代表輸出到控制臺,同時并沒有進行任何過濾,所以只要是INFO級別以上的都會在控制臺輸出。
四、filter過濾器
其它的一看就懂,就這里,一開始一直想不明白,為什么上面的info文件里只有info和warn,而err文件中只有err日志。后來明白了。
他有幾個常用的過濾器
(1)LevelFilter 過濾器
級別過濾器,根據(jù)日志級別進行過濾。如果日志級別等于配置級別,過濾器會根據(jù)onMath 和 onMismatch接收或拒絕日志。
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter>
< level>:設(shè)置過濾級別
將過濾器的日志級別配置為ERROR,所有ERROR級別的日志交給appender處理,非ERROR級別的日志,被過濾掉。
(這樣的話那上面不是只顯示ERROR日志,怎么最后顯示的是INFO和WARN日志呢?看下面)
< onMatch>: 用于配置符合過濾條件的操作
< onMismatch>:用于配置不符合過濾條件的操作
再看有這么幾個單詞DENY(拒絕),NEUTRAL(中性),ACCEPT(接受)
(1)返回DENY,日志將立即被拋棄不再經(jīng)過其他過濾器; (2)返回NEUTRAL,有序列表里的下個過濾器過接著處理日志; (3)返回ACCEPT,日志會被立即處理,不再經(jīng)過剩余過濾器
在理解下:
<level>ERROR</level> <!-- 所有ERROR級別的日志交給appender處理,非ERROR級別的日志,被過濾掉 --> <onMatch>DENY</onMatch> <!-- 代表符合過濾條件的拒絕輸出 --> <onMismatch>ACCEPT</onMismatch> <!-- 不符合過濾條件的接受輸出 -->
我靠,這么繞一圈不還是表示非ERROR級別的輸出嘛,DEBUG除外,因為DUBUG在root標(biāo)簽,已經(jīng)過濾掉,都不會走到appender標(biāo)簽這里
(2)ThresholdFilter 過濾器
臨界值過濾器,過濾掉低于指定臨界值的日志。當(dāng)日志級別等于或高于臨界值時,過濾器返回NEUTRAL;當(dāng)日志級別低于臨界值時,日志會被拒絕。
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter>
這里只會訪問ERROR及以上級別的過濾器,而ERROR已經(jīng)是最高級了,所以就只顯示ERROR日志在errer文件中了,所以一切都通了。
到此這篇關(guān)于SpringBoot整合logback日志的文章就介紹到這了,更多相關(guān)SpringBoot整合logback內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實現(xiàn)漢字轉(zhuǎn)unicode與漢字轉(zhuǎn)16進制實例
這篇文章主要介紹了java實現(xiàn)漢字轉(zhuǎn)unicode與漢字轉(zhuǎn)16進制的實現(xiàn)方法,是Java操作漢字編碼轉(zhuǎn)換的一個典型應(yīng)用,非常具有實用價值,需要的朋友可以參考下2014-10-10java基本教程之Thread中start()和run()的區(qū)別 java多線程教程
這篇文章主要介紹了Thread中start()和run()的區(qū)別,Thread類包含start()和run()方法,它們的區(qū)別是什么?下面將對此作出解答2014-01-01