【轉】 springBoot(10)---logback日誌
【轉】 springBoot(10)---logback日誌
logback日誌
一、概述
和log4j優點:
實際上,這兩個日誌框架都出自同一個開發者之手,Logback 相對於 Log4J 有更多的優點
(1)logback不僅效能提升了,初始化記憶體載入也更小了。
(2)內容更豐富的文件
(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>
二、新建logback-spring.xml
springboot官方建議命名為logback-spring.xml,在src/main/resources新建logback-spring.xml,這裡不需要在application.properties中配置
預設載入載入配置順序 logback-spring.xml
<?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> <!-- 設定滾動策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 路徑,因為有 %d所以每天都會意時間來建立新的檔案 --> <fileNamePattern>app_log/log/app.err.%d.log</fileNamePattern> <!-- 控制保留的歸檔檔案的最大數量,超出數量就刪除舊檔案,假設設定每個月滾動, 且<maxHistory> 是1,則只儲存最近1個月的檔案,刪除之前的舊檔案 --> <MaxHistory>1</MaxHistory> <!-- 保持30天的歷史記錄上限為3GB總大小 --> <totalSizeCap>3GB</totalSizeCap> </rollingPolicy> </appender>
<!--這裡選擇INFO就代表,進行INFO級別輸出記錄,那麼在控制檯也好,log檔案也好只記錄INFO及以上級別的日誌,這裡相當於第一道過濾器--> <root level="INFO"> <appender-ref ref="consoleApp"/> <appender-ref ref="fileInfoApp"/> <appender-ref ref="fileErrorApp"/> </root> </configuration>
有關配置檔案詳細介紹放到下面講,這裡先跳過
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、效果:
我們發現,在專案中自動建立app_log/log/app.info(當天日期).log和app.err(當天日期).log檔案
然後我們看
app.err.2018-05-21.log
它只存放err級別日誌
app.info.2018-05-21.log
它只存放的info和warn兩種基本日誌,這是為什麼呢?詳細介紹下配置檔案
三、配置檔案介紹
一:根節點<configuration>
它的三個子節點
(1)<appender></appender>格式化日誌輸出節點,有兩個必要屬性name和class。
(2) <logger></logger> 用來設定某一個包或具體的某一個類的日誌列印級別、以及指定<appender>。
(3)<root></root>(要加在最後)(必選,而且只有一個)(用來指定最基礎的日誌輸出級別,他有倆個自己點可以用來應用appender,格式化日誌輸出)
二、appender節點
它有兩個屬性name和class
(1)class="ch.qos.logback.core.ConsoleAppender":把日誌輸出到
(2)class="ch.qos.logback.core.FileAppender":把日誌新增到檔案
(3)class="ch.qos.logback.core.rolling.RollingFileAppender":滾動記錄檔案,先將日誌檔案指定到檔案,當符合某個條件時,將日誌記錄到其他檔案
所以上面第一個appender代表輸出到控制檯,同時並沒有進行任何過濾,所以只要是INFO級別以上的都會在控制檯輸出。
四、filter過濾器
其它的一看就懂,就這裡,一開始一直想不明白,為什麼上面的info檔案裡只有info和warn,而err檔案中只有err日誌。後來明白了。
他有幾個常用的過濾器
(1)LevelFilter 過濾器
級別過濾器,根據日誌級別進行過濾。如果日誌級別等於配置級別,過濾器會根據onMath 和 onMismatch接收或拒絕日誌。
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter>
<level>:設定過濾級別
將過濾器的日誌級別配置為ERROR,所有ERROR級別的日誌交給appender處理,非ERROR級別的日誌,被過濾掉。
(這樣的話那上面不是隻顯示ERROR日誌,怎麼最後顯示的是INFO和WARN日誌呢?看下面)
<onMatch>: 用於配置符合過濾條件的操作
<onMismatch>:用於配置不符合過濾條件的操作
再看有這麼幾個單詞DENY(拒絕),NEUTRAL(中性),ACCEPT(接受)
(1)返回DENY,日誌將立即被拋棄不再經過其他過濾器;
(2)返回NEUTRAL,有序列表裡的下個過濾器過接著處理日誌;
(3)返回ACCEPT,日誌會被立即處理,不再經過剩餘過濾器
在理解下:
<level>ERROR</level> <!-- 所有ERROR級別的日誌交給appender處理,非ERROR級別的日誌,被過濾掉 --> <onMatch>DENY</onMatch> <!-- 代表符合過濾條件的拒絕輸出 --> <onMismatch>ACCEPT</onMismatch> <!-- 不符合過濾條件的接受輸出 -->
我靠,這麼繞一圈不還是表示非ERROR級別的輸出嘛,DEBUG除外,因為DUBUG在root標籤,已經過濾掉,都不會走到appender標籤這裡
(2)ThresholdFilter 過濾器
臨界值過濾器,過濾掉低於指定臨界值的日誌。當日志級別等於或高於臨界值時,過濾器返回NEUTRAL;當日志級別低於臨界值時,日誌會被拒絕。
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter>
這裡只會訪問ERROR及以上級別的過濾器,而ERROR已經是最高階了,所以就只顯示ERROR日誌在errer檔案中了,所以一切都通了
github原始碼:原始碼
想太多,做太少,中間的落差就是煩惱。想沒有煩惱,要麼別想,要麼多做。上尉【11】