1. 程式人生 > >logback使用與配置檔案logback.xml詳解

logback使用與配置檔案logback.xml詳解

一、logback簡介

  • Logback由log4j創始人設計的另一個開源日誌元件,官網:http://logback.qos.ch。它當前分為下面三模組:
    • logback-core:其它兩個模組的基礎模組
    • logback-classic:它是log4j的一個改良版本,同時它完整實現了slf4jAPI使你可以很方便地更換成其它日誌系統如log4j或JDK14 Logging
    • logback-access:訪問模組與Servlet容器整合提供通過Http來訪問日誌的功能

二、maven依賴

logback需要和slf4j一起使用,共需新增依賴包有slf4j-api.jar,logback-core.jar,logback-classic.jar,logback-access.jar暫時不用不新增.

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

三、logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--configuration屬性:
        scan: 為true時,配置檔案發生改變,將會被重新載入,預設值為true。
     scanPeriod: 監測配置檔案是否有修改的時間間隔,預設單位是毫秒。當scan為true時,此屬性生效。預設間隔1分鐘。
     debug: 為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。 -->
<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">   
        <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>

四、logback的預設配置

Logback預設配置的步驟

 1. 在 classpath下查詢檔案logback-test.xml;
 2. 如果不存在,則查詢logback.xml;
 3. 如果都不存在,logback用BasicConfigurator自動配置,記錄輸出到控制檯。

Logback用BasicConfigurator自動配置,建立一個最小化配置。輸出用模式為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 進行格式化。root logger 預設級別是 DEBUG。

五、logback.xml常用配置

1、子節點 appender

負責寫日誌的元件,它有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名

  1. ConsoleAppender 把日誌輸出到控制檯.
   <!--   <encoder>:對日誌進行格式化。 -->
  <!--  <target>:字串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>

  2. FileAppender:把日誌新增到檔案.

  <!--  <file>:被寫入的檔名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動建立,沒有預設值。
      <append>:如果是 true,日誌被追加到檔案結尾,如果是 false,清空現存檔案,預設是true。
      <encoder>:對記錄事件進行格式化。(具體引數稍後講解 )
      <prudent>:如果是 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>    

 3. RollingFileAppender:滾動記錄檔案,先將日誌記錄到指定檔案,當符合某個條件時,將日誌記錄到其他檔案。

  <!--  <file>:被寫入的檔名,相對目錄或絕對目錄,上級目錄不存在會自動建立,沒有預設值。
      <append>: true,日誌被追加到檔案結尾,false,清空現存檔案,預設是true。   
      <rollingPolicy>:當發生滾動時,決定RollingFileAppender的行為,涉及檔案移動和重新命名。

          屬性class定義具體的滾動策略類
      
      class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy": 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動。有以下子節點:
      <fileNamePattern>:必要節點,包含檔名及“%d”轉換符,“%d”可以包含一個java.text.SimpleDateFormat指定的時間格式,如:%d{yyyy-MM}。
          如果直接使用 %d,預設格式是 yyyy-MM-dd。RollingFileAppender的file位元組點可有可無,通過設定file,可以為活動檔案和歸檔檔案指定不同位置,當前日誌總是記錄到file指定的檔案(活動檔案),活動檔案的名字不會改變;
          如果沒設定file,活動檔案的名字會根據fileNamePattern 的值,每隔一段時間改變一次。“/”或者“\”會被當做目錄分隔符。  
      <maxHistory>:

      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy": 檢視當前活動檔案的大小,如果超過指定大小會告知RollingFileAppender 觸發當前活動檔案滾動。只有一個節點:
        <maxFileSize>:這是活動檔案的大小,預設值是10MB。
        <prudent>:當為true時,不支援FixedWindowRollingPolicy。支援TimeBasedRollingPolicy,但是有兩個限制,1不支援也不允許檔案壓縮,2不能設定file屬性,必須留空。
      <triggeringPolicy >: 告知 RollingFileAppender 合適啟用滾動。
      
      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy" 根據固定視窗演算法重新命名檔案的滾動策略。有以下子節點:
        <minIndex>:視窗索引最小值
        <maxIndex>:視窗索引最大值,當用戶指定的視窗過大時,會自動將視窗設定為12。
        <fileNamePattern>:必須包含“%i”例如,假設最小值和最大值分別為1和2,命名模式為 mylog%i.log,會產生歸檔檔案mylog1.log和mylog2.log。還可以指定檔案壓縮選項,例如,mylog%i.log.gz 或者 沒有log%i.log.zip
   -->
      
        <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個歸檔檔案後,將覆蓋最早的日誌。
          <encoder>:對記錄事件進行格式化。負責兩件事,一是把日誌資訊轉換成位元組陣列,二是把位元組陣列寫入到輸出流。
              PatternLayoutEncoder 是唯一有用的且預設的encoder ,有一個<pattern>節點,用來設定日誌的輸入格式。使用“%”加“轉換符”方式,如果要輸出“%”,則必須用“\”對“\%”進行轉義。-->

  4. SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender,並不常用。
大家可以參考官方文件(http://logback.qos.ch/documentation.html),還可以編寫自己的Appender。

2. 子節點 logger

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

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

3. 子節點 root

它也是 logger元素,但是它是根logger,是所有 logger的上級。只有一個level屬性,因為name已經被命名為”root”,且已經是最上級了。
level: 用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,不能設定為INHERITED或者同義詞NULL。 預設是DEBUG。