天天看點

Logback的使用和logback.xml詳解一、Logback的介紹二、Logback取代log4j的理由三、Logback的配置介紹四、Logback的預設配置五、logback.xml常用配置詳解

一、Logback的介紹

Logback是由log4j創始人設計的另一個開源日志元件,官方網站: http://logback.qos.ch。它目前分為下面幾個子產品:   

  • logback-core:其它兩個子產品的基礎子產品   
  • logback-classic:它是log4j的一個改良版本,同時它完整實作了slf4j API使你可以很友善地更換成其它日志系統如log4j或JDK14 Logging
  • logback-access:通路子產品與Servlet容器內建提供通過Http來通路日志的功能

二、Logback取代log4j的理由

1、更快的實作:Logback的核心重寫了,在一些關鍵執行路徑上性能提升10倍以上。而且logback不僅性能提升了,初始化記憶體加載也更小了。

2、非常充分的測試:Logback經過了幾年,數不清小時的測試。Logback的測試完全不同級别的。

3、Logback-classic非常自然實作了SLF4j:Logback-classic實作了SLF4j。在使用SLF4j中,你都感覺不到logback-classic。而且因為logback-classic非常自然地實作了slf4j , 是以切換到log4j或者其他,非常容易,隻需要提供成另一個jar包就OK,根本不需要去動那些通過SLF4JAPI實作的代碼。

4、非常充分的文檔 官方網站有兩百多頁的文檔。

5、自動重新加載配置檔案,當配置檔案修改了,Logback-classic能自動重新加載配置檔案。掃描過程快且安全,它并不需要另外建立一個掃描線程。這個技術充分保證了應用程式能跑得很歡在JEE環境裡面。

6、Lilith是log事件的觀察者,和log4j的chainsaw類似。而lilith還能處理大數量的log資料 。

7、謹慎的模式和非常友好的恢複,在謹慎模式下,多個FileAppender執行個體跑在多個JVM下,能 夠安全地寫到同一個日志檔案。RollingFileAppender會有些限制。Logback的FileAppender和它的子類包括 RollingFileAppender能夠非常友好地從I/O異常中恢複。

8、配置檔案可以處理不同的情況,開發人員經常需要判斷不同的Logback配置檔案在不同的環境下(開發,測試,生産)。而這些配置檔案僅僅隻有一些很小的不同,可以通過,和來實作,這樣一個配置檔案就可以适應多個環境。

9、Filters(過濾器)有些時候,需要診斷一個問題,需要打出日志。在log4j,隻有降低日志級别,不過這樣會打出大量的日志,會影響應用性能。在Logback,你可以繼續 保持那個日志級别而除掉某種特殊情況,如alice這個使用者登入,她的日志将打在DEBUG級别而其他使用者可以繼續打在WARN級别。要實作這個功能隻需加4行XML配置。可以參考MDCFIlter 。

10、SiftingAppender(一個非常多功能的Appender):它可以用來分割日志檔案根據任何一個給定的運作參數。如,SiftingAppender能夠差別日志事件跟進使用者的Session,然後每個使用者會有一個日志檔案。

11、自動壓縮已經打出來的log:RollingFileAppender在産生新檔案的時候,會自動壓縮已經打出來的日志檔案。壓縮是個異步過程,是以甚至對于大的日志檔案,在壓縮過程中應用不會受任何影響。

12、堆棧樹帶有包版本:Logback在打出堆棧樹日志時,會帶上包的資料。

13、自動去除舊的日志檔案:通過設定TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory屬性,你可以控制已經産生日志檔案的最大數量。如果設定maxHistory值為12,那那些log檔案超過12個月的都會被自動移除。

三、Logback的配置介紹

1、Logger、appender及layout

Logger作為日志的記錄器,把它關聯到應用的對應的context上後,主要用于存放日志對象,也可以定義日志類型、級别。

Appender主要用于指定日志輸出的目的地,目的地可以是控制台、檔案、遠端套接字伺服器、 MySQL、PostreSQL、 Oracle和其他資料庫、 JMS和遠端UNIX Syslog守護程序等。 Layout 負責把事件轉換成字元串,格式化的日志資訊的輸出。

2、logger context

各個logger 都被關聯到一個 LoggerContext,LoggerContext負責制造logger,也負責以樹結構排列各logger。其他所有logger也通過org.slf4j.LoggerFactory 類的靜态方法getLogger取得。 getLogger方法以 logger名稱為參數。用同一名字調用LoggerFactory.getLogger 方法所得到的永遠都是同一個logger對象的引用。

3、有效級别及級别的繼承

Logger 可以被配置設定級别。級别包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定義于ch.qos.logback.classic.Level類。如果 logger沒有被配置設定級别,那麼它将從有被配置設定級别的最近的祖先那裡繼承級别。root logger 預設級别是 DEBUG。

4、列印方法與基本的選擇規則

列印方法決定記錄請求的級别。

例如,如果 L 是一個 logger 執行個體,那麼,語句 L.info("..")是一條級别為 INFO的記錄語句。記錄請求的級别在高于或等于其 logger 的有效級别時被稱為被啟用,否則,稱為被禁用。

記錄請求級别為 p,其 logger的有效級别為 q,隻有則當 p>=q時,該請求才會被執行。

該規則是 logback 的核心。日志級别為: TRACE < DEBUG < INFO < WARN < ERROR

四、Logback的預設配置

如果配置檔案 logback-test.xml 和 logback.xml 都不存在,那麼 logback 預設地會調用BasicConfigurator ,建立一個最小化配置。最小化配置由一個關聯到根 logger 的ConsoleAppender 組成。

輸出用模式為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 進行格式化。root logger 預設級别是 DEBUG。

1、Logback的配置檔案 Logback 配置檔案的文法非常靈活。

正因為靈活,是以無法用 DTD 或 XML schema 進行定義。

盡管如此,可以這樣描述配置檔案的基本結構:以<configuration>開頭,後面有零個或多個<appender>元素,有零個或多個<logger>元素,有最多一個<root>元素。

2、Logback預設配置的步驟

(1). 嘗試在 classpath下查找檔案logback-test.xml;

(2). 如果檔案不存在,則查找檔案logback.xml;

(3). 如果兩個檔案都不存在,logback用BasicConfigurator自動對自己進行配置,這會導緻記錄輸出到控制台。

五、logback.xml常用配置詳解

Logback的使用和logback.xml詳解一、Logback的介紹二、Logback取代log4j的理由三、Logback的配置介紹四、Logback的預設配置五、logback.xml常用配置詳解

1、根節點<configuration>

<configuration>包含下面三個屬性:

  • scan: 當此屬性設定為true時,配置檔案如果發生改變,将會被重新加載,預設值為true。
  • scanPeriod: 設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間機關,預設機關是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。
  • debug: 當此屬性設定為true時,将列印出logback内部日志資訊,實時檢視logback運作狀态。預設值為false。
<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
      <!--其他配置省略--> 
</configuration>
           

 2、子節點<contextName>: 用來設定上下文名稱

,每個logger都關聯到logger上下文,預設上下文名稱為default。但可以使用<contextName>設定成其他名字,用于區分不同應用程式的記錄。一旦設定,不能修改。

例如:

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

3、子節點<property> :用來定義變量值

,它有兩個屬性name和value,通過<property>定義的值會被插入到logger上下文中,可以使“${}”來使用變量。

  • name: 變量的名稱
  • value: 的值時變量定義的值 
<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
      <property name="APP_Name" value="myAppName" /> 
      <contextName>${APP_Name}</contextName> 
      <!--其他配置省略--> 
     </configuration>
           

4、子節點<timestamp>:擷取時間戳字元串

有兩個屬性key和datePattern

  • key: 辨別此<timestamp> 的名字;
  • datePattern: 設定将目前時間(解析配置檔案的時間)轉換為字元串的模式,遵循java.txt.SimpleDateFormat的格式。
<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
      <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/> 
      <contextName>${bySecond}</contextName> 
     <!-- 其他配置省略--> 
    </configuration>
           

5、子節點<appender>:負責寫日志的元件

它有兩個必要屬性name和class。

name指定appender名稱,

class指定appender的全限定名

5.1ConsoleAppender 把日志輸出到控制台

有以下子節點:

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

上述配置表示把>=DEBUG級别的日志都輸出到控制台

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

上述配置表示把>=DEBUG級别的日志都輸出到testFile.log

5.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。
  •              <maxHistory>:可選節點,控制保留的單個歸檔檔案的最大值,超出數量就删除舊檔案。
  •             <totalSizeCap>:可選節點,控制保留的歸檔檔案的總數量量,超出數量就滾動覆寫曆史舊檔案。
  • RollingFileAppender的file位元組點可有可無,通過設定file,可以為活動檔案和歸檔檔案指定不同位置,目前日志總是記錄到file指定的檔案(活動檔案),活動檔案的名字不會改變;如果沒設定file,活動檔案的名字會根據fileNamePattern 的值,每隔一段時間改變一次。“/”或者“\”會被當做目錄分隔符。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>
            <maxFileSize>5MB</maxFileSize>  
            <totalSizeCap>500MB</totalSizeCap> 
        </rollingPolicy>
        <encoder>  
            <pattern>%-4relative [%thread] %-5level %logger{35} - >>>%msg%n</pattern> 
        </encoder> 
  </appender> 
  <root level="DEBUG"> 
      <appender-ref ref="FILE" /> 
  </root> 
</configuration>
           

       上述配置表示每天生成一個日志檔案,儲存30天的日志檔案,每個日志檔案最大為5MB,總的日志大小為500MB。

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

上述配置表示按照固定視窗模式生成日志檔案,當檔案大于5MB時,生成新的日志檔案。

視窗大小是1到3,當儲存了3個歸檔檔案後,将覆寫最早的日志。

<encoder>:對記錄事件進行格式化。負責兩件事,一是把日志資訊轉換成位元組數組,二是把位元組數組寫入到輸出流。

PatternLayoutEncoder 是唯一有用的且預設的encoder ,有一個<pattern>節點,用來設定日志的輸入格式。使用“%”加“轉換符”方式,如果要輸出“%”,則必須用“\”對“%”進行轉義。

5.4 還有SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender,并不常用,這裡就不詳解了。 大家可以參考官方文檔(http://logback.qos.ch/documentation.html),還可以編寫自己的Appender。

6  子節點<loger>:用來設定某一個包或具體的某一個類的日志列印級别、以及指定<appender>

<loger>僅有一個name屬性,

  • 一個可選的level

      用來設定列印級别,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級别。 如果未設定此屬性,那麼目前loger将會繼承上級的級别。

  • 一個可選的addtivity屬性。 可以包含零個或多個<appender-ref>元素,辨別這個appender将會添加到這個loger name: 用來指定受此loger限制的某一個包或者具體的某一個類。

      是否向上級loger傳遞列印資訊。預設是true。同<loger>一樣,可以包含零個或多個<appender-ref>元素,辨別這個appender将會添加到這個loger。

7、子節點<root>

它也是<loger>元素,但是它是根loger,是所有<loger>的上級。隻有一個level屬性,因為name已經被命名為"root",且已經是最上級了。

level: 用來設定列印級别,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF

不能設定為INHERITED或者同義詞NULL。

預設是DEBUG。