1. 程式人生 > 其它 >logback.xml常用配置詳解

logback.xml常用配置詳解

在這裡插入圖片描述

1、根節點,包含下面三個屬性:

  • scan: 當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。

  • scanPeriod: 設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。

  • debug: 當此屬性設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。

例如:

    <configuration scan="true" scanPeriod="60 seconds" debug=
"false">       <!--其他配置省略--> </configuration>

2、子節點,用來設定上下文名稱: 每個logger都關聯到logger上下文,預設上下文名稱為default。但可以使用設定成其他名字,用於區分不同應用程式的記錄。一旦設定,不能修改。

例如:

    <configuration scan="true" scanPeriod="60 seconds" debug="false"> 
          <contextName>
myAppName</contextName>       <!--其他配置省略--> </configuration>

3、子節點: 用來定義變數值,它有兩個屬性name和value,通過定義的值會被插入到logger上下文中,可以使“${}”來使用變數。

  • name: 變數的名稱
  • value: 的值時變數定義的值

例如:

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
      <
property name="APP_Name" value="myAppName" />       <contextName>${APP_Name}</contextName>       <!--其他配置省略--> </configuration>

4.子節點:負責寫日誌的元件,它有兩個必要屬性name和class。

  • name指定appender名稱
  • class指定appender的全限定名

(1) ConsoleAppender 把日誌輸出到控制檯,有以下子節點:

  • :對日誌進行格式化。
  • :字串System.out(預設)或者System.err
<configuration> 
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
      <encoder> 
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> 
      </encoder> 
      </appender> 
 
      <root level="DEBUG"> 
        <appender-ref ref="STDOUT" /> 
      </root> 
</configuration>

上述配置表示把>=DEBUG級別的日誌都輸出到控制檯

  • :過濾器,在Logback-classic中提供兩個型別的 filters , 一種是 regular filters ,另一種是 turbo filter。regular filters 是與appender 繫結的, 而turbo filter是與與logger context(logger 上下文)繫結的,區別就是,turbo filter過濾所有logging request ,而regular filter只過濾某個appender的logging request。
    Regular filters:在 logback-classic中,filters 繼承 Filter 抽象類,Filter 抽象類有一個 decide()抽象方法,接收一個 ILoggingEvent 物件引數,而在 logback-access 中 則是 AccessEvent 物件。該方法返回一個enum型別 FilterReply。值可以是
    DENY:如果方法返回DENY(拒絕),則跳出過濾鏈,而該 logging event 也會被拋棄。
    NRUTRAL:如果返回NRUTRAL(中立),則繼續過濾鏈中的下一個過濾器。
    ACCEPT:如果返回ACCEPT(通過),則跳出過濾鏈

下面是幾個常用的過濾器:
LevelFilter: 級別過濾器,根據日誌級別進行過濾。如果日誌級別等於配置級別,過濾器會根據onMath 和 onMismatch接收或拒絕日誌。有以下子節點:
:設定過濾級別
:用於配置符合過濾條件的操作

    <onMismatch>:用於配置不符合過濾條件的操作

    例如:將過濾器的日誌級別配置為INFO,所有INFO級別的日誌交給appender處理,非INFO級別的日誌,被過濾掉。
<configuration>   
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">   
    <filter class="ch.qos.logback.classic.filter.LevelFilter">   
      <level>INFO</level>   
      <onMatch>ACCEPT</onMatch>   
      <onMismatch>DENY</onMismatch>   
    </filter>   
    <encoder>   
      <pattern>   
        %-4relative [%thread] %-5level %logger{30} - %msg%n   
      </pattern>   
    </encoder>   
  </appender>   
  <root level="DEBUG">   
    <appender-ref ref="CONSOLE" />   
  </root>   
</configuration>  

(2) FileAppender:把日誌新增到檔案,有以下子節點:

  • :被寫入的檔名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動建立,沒有預設值。
  • :如果是 true,日誌被追加到檔案結尾,如果是 false,清空現存檔案,預設是true。
  • :對記錄事件進行格式化。(具體引數稍後講解 )
  • :如果是 true,日誌會被安全的寫入檔案,即使其他的FileAppender也在向此檔案做寫入操作,效率低,預設是 false。

例如:

    <configuration> 
          <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
            <file>testFile.log</file> 
            <append>true</append> 
            <encoder> 
              <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
            </encoder> 
          </appender> 
     
     
          <root level="DEBUG"> 
          <appender-ref ref="FILE" /> 
          </root> 
    </configuration>

RollingFileAppender:滾動記錄檔案, 先將日誌記錄到指定檔案,當符合某個條件時,將日誌記錄到其他檔案。有以下子節點:

  • :被寫入的檔名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動建立,沒有預設值。
  • :如果是 true,日誌被追加到檔案結尾,如果是 false,清空現存檔案,預設是true。
  • :當發生滾動時,決定RollingFileAppender的行為,涉及檔案移動和重新命名。屬性class定義具體的滾動策略類——
    <configuration> 
              <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
                  <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> 
                  <maxHistory>30</maxHistory> 
                </rollingPolicy> 
                <encoder> 
                  <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
                </encoder> 
              </appender> 
     
     
              <root level="DEBUG"> 
                <appender-ref ref="FILE" /> 
              </root> 
    </configuration>

上述配置表示每天生成一個日誌檔案,儲存30天的日誌檔案。

    <configuration> 
              <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
                <file>test.log</file> 
     
     
                <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
                  <fileNamePattern>tests.%i.log.zip</fileNamePattern> 
                  <minIndex>1</minIndex> 
                  <maxIndex>3</maxIndex> 
                </rollingPolicy> 
     
     
                <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
                  <maxFileSize>5MB</maxFileSize> 
                </triggeringPolicy> 
                <encoder> 
                  <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
                </encoder> 
              </appender> 
     
     
              <root level="DEBUG"> 
                <appender-ref ref="FILE" /> 
              </root> 
            </configuration>

上述配置表示按照固定視窗模式生成日誌檔案,當檔案大於20MB時,生成新的日誌檔案。視窗大小是1到3,當儲存了3個歸檔檔案後,將覆蓋最早的日誌。

子節點:用來設定某一個包或具體的某一個類的日誌列印級別、以及指定。僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。

可以包含零個或多個<appender-ref>元素,標識這個appender將會新增到這個loger 
  • name: 用來指定受此loger約束的某一個包或者具體的某一個類。
  • level: 用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,還有一個特殊值INHERITED或者同義詞NULL,代表強制執行上級的級別。 如果未設定此屬性,那麼當前loger將會繼承上級的級別。
  • addtivity: 是否向上級loger傳遞列印資訊。預設是true。同一樣,可以包含零個或多個元素,標識這個appender將會新增到這個loger。

例如:

        <logger name="com.mmall" additivity="false" level="INFO" >
            <appender-ref ref="mmall" />
            <appender-ref ref="console"/>
        </logger>

子節點:它也是元素,但是它是根logger,是所有的上級。只有一個level屬性,因為name已經被命名為"root",且已經是最上級了。

level: 用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,不能設定為INHERITED或者同義詞NULL。 預設是DEBUG。

    <root level="DEBUG">
            <appender-ref ref="console"/>
            <appender-ref ref="error"/>
    </root>

Demo

1、新增依賴包logback使用需要和slf4j一起使用,所以總共需要新增依賴的包有slf4j-api

logback使用需要和slf4j一起使用,所以總共需要新增依賴的包有slf4j-api.jar,logback-core.jar,logback-classic.jar,logback-access.jar這個暫時用不到所以不新增依賴了,maven配置

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <logback.version>1.1.7</logback.version>
    <slf4j.version>1.7.21</slf4j.version>
  </properties>
 
  <dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>${logback.version}</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
      </dependency>
</dependencies>

2、logback.xml配置

<?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false">
        <!--定義日誌檔案的儲存地址 勿在 LogBack 的配置中使用相對路徑-->
        <property name="LOG_HOME" value="/home" />
        <!-- 控制檯輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日誌檔案 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日誌檔案輸出的檔名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日誌檔案保留天數-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日誌檔案最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
 
    <!-- 日誌輸出級別 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

3、java程式碼

public class App {
  private final static Logger logger = LoggerFactory.getLogger(App.class);
 
    public static void main(String[] args) {
      logger.info("logback 成功了");
      logger.error("logback 成功了");
      logger.debug("logback 成功了");
    }
  }