日積月累之Logback框架

半杯態發表於2020-10-24

Logback引入

Logback主要分為三個模組:

  • logback-core :其它兩個模組的基礎模組
  • logback-classic :它是log4j的一個改良版本,同時它完整實現了slf4j API
  • logback-access :訪問模組與Servlet容器整合提供通過Http來訪問日誌的功能
maven新增依賴:
		<!--slf4j 日誌門面-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.26</version>
        </dependency>
        <!--logback 日誌實現-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
案例:
public class LogbackTest {

    public static final Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class);
    // 快速入門
    @Test
    public void testQuick() throws Exception {
        
        for (int i = 0; i < 10000; i++) {
            // 日誌輸出
            LOGGER.error("error");
            LOGGER.warn("wring");
            LOGGER.info("info");
            LOGGER.debug("debug");// 預設級別
            LOGGER.trace("trace");
        }
    }
}

logback元件之間的關係:

  1. Logger:日誌的記錄器,把它關聯到應用的對應的context上後,主要用於存放日誌物件,也
    可以定義日誌型別、級別。
  2. Appender:用於指定日誌輸出的目的地,目的地可以是控制檯、檔案、資料庫等等。
  3. Layout:負責把事件轉換成字串,格式化的日誌資訊的輸出。在logback中Layout物件被封
    裝在encoder中。

Appender: 設定日誌資訊的去向,常用的有以下幾個
ch.qos.logback.core.ConsoleAppender (控制檯)

ch.qos.logback.core.rolling.RollingFileAppender (檔案大小到達指定尺寸的時候產生一個新檔案)

ch.qos.logback.core.FileAppender (檔案)

自定義logger物件:

用來設定某一個包或者具體的某一個類的日誌列印級別、以及指定。
僅有一個name屬性,一個可選的level和一個可選的addtivity屬性
name:
用來指定受此logger約束的某一個包或者具體的某一個類。
level:
用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和OFF, 如果未設定此屬性,那麼當前logger將會繼承上級的級別。
additivity:
是否向上級loger傳遞列印資訊。預設是true。
可以包含零個或多個元素,標識這個appender將會新增到這個logger

提示:檔案中的property設定的路徑是相對於根路徑

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <!--
            配置集中管理屬性
            我們可以直接改屬性的 value 值
            格式:${name}
        -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n">
        <!--
    日誌輸出格式:
        %-5level
        %d{yyyy-MM-dd HH:mm:ss.SSS}日期
        %c類的完整名稱
        %M為method
        %L為行號
        %thread執行緒名稱
        %m或者%msg為資訊
        %n換行
      -->
    </property>

    <!--定義日誌檔案儲存路徑屬性-->
    <property name="log_dir" value="/logs"></property>

    <!--控制檯日誌輸出的 appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制輸出流物件 預設 System.out 改為 System.err-->
        <target>System.err</target>
        <!--日誌訊息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--日誌檔案輸出的 appender-->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <!--日誌檔案儲存路徑-->
        <file>${log_dir}/logback.log</file>
        <!--日誌訊息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--html 格式日誌檔案輸出 appender-->
    <appender name="htmlFile" class="ch.qos.logback.core.FileAppender">
        <!--日誌檔案儲存路徑-->
        <file>${log_dir}/logback.html</file>
        <!--html 訊息格式配置-->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <pattern>%-5level%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m</pattern>
            </layout>
        </encoder>
    </appender>

    <!--日誌拆分和歸檔壓縮的 appender 物件-->
    <appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日誌檔案儲存路徑-->
        <file>${log_dir}/roll_logback.log</file>
        <!--html 訊息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!--指定拆分規則-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">

            <!--按照時間和壓縮格式宣告拆分的檔名-->
            <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>

            <!--按照檔案大小拆分-->
            <maxFileSize>1MB</maxFileSize>


        </rollingPolicy>
        <!--日誌級別過濾器-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--日誌過濾規則-->
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--非同步日誌-->
    <appender name="async" class="ch.qos.logback.classic.AsyncAppender">
        <!--指定某個具體的 appender-->
        <appender-ref ref="rollFile"/>
    </appender>
    
  <!--
    也是<logger>元素,但是它是根logger。預設debug
    level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL
和 OFF,
    <root>可以包含零個或多個<appender-ref>元素,標識這個appender將會新增到這個
logger。
  -->
  
  
    <root level = "All">
        <appender-ref ref="console"/>
        <!--<appender-ref ref="file"/>-->
      <!--  <appender-ref ref="htmlFile" />-->
       <!-- <appender-ref ref="async"/>-->
    </root>
    <!--自定義 logger 物件
            additivity="false" 自定義 logger 物件是否繼承 rootLogger
            如果additivity="true",Logger就會列印root標籤中的日誌,如果additivity="false",不會執行root標籤中的日誌
         -->
    <logger name="com.banbeitai" level="info" additivity="true">
        <appender-ref ref="console"/>
    </logger>
</configuration>
輸出效果:
網頁輸出形式:

在這裡插入圖片描述

檔案輸出形式:

在這裡插入圖片描述

相關文章