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, 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>
        
        <!-- 設置滾動策略 -->
        <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節點

    它有兩個屬性nameclass

    (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】

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM