Logback 簡明使用手冊

主要內容

  1. 跑起來
  2. 配置項
  3. 工做原理

1. 統一日誌輸出

巴拉巴拉。。。 (爲何這麼玩,有什麼好處 google it)html

說明: 本篇主要偏應用爲主,介紹瞭如何使用logback, 以及相關的配置,對於這個東西的實現原理以及工做機制,沒有涉入; 此外大部份內容來源於互聯網,博客,這裏只是給了一個梳理和小結,方便一鍵式接入java

官方文檔 http://logback.qos.ch/manual/index.html算法

2. 跑起來

基本配置

maven依賴:app

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>${logback.version}</version>
</dependency>

代碼中使用方式maven

package com.mushroom.hui;

public class LogTest {
  private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory(LogTest.class);
  
  @Test 
  public void logTest() {
    logger.info("hello wolrd! This is in method {}, print by {}", "logTest", "yihui");
  }
}

完成上面的這些,測試一下,發現控制檯沒有任何輸出,由於缺了配置文件測試

配置文件在log4j裏一般叫作log4j.xml,在logback裏是logback.xml,或者,在測試環境裏叫作logback-test.xml。ui

在Maven project裏,logback.xml文件必須放在$PROJECT_HOME/src/main/resources目錄中。logback-test.xml文件必須放在$PROJECT_HOME/src/test/resources目錄中google

ok,在測試工程中添加一個 logback-test.xml 配置文件:lua

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
           ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

順帶提一句,xml加載順序是: logback.groovy -> logback.xml -> logback-test.xml -> default(默認)debug

3. 配置文件怎麼玩

上面就有一個簡單的配置文件,首先對出現的幾個節點(<節點>)進行說明

a. configuration

從這霸氣的名字能夠看出,這貨就是根節點,定義一些配置相關信息

scan: 當此屬性設置爲true時,配置文件若是發生改變,將會被從新加載,默認值爲true。

scanPeriod: 設置監測配置文件是否有修改的時間間隔,若是沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。

debug: 當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。

<!-- 部署出logback內部日誌信息,每隔60s判斷一下配置文件有沒有個更新,若更新,則從新加載 -->
<configuration debug="false" scan="true" scanPeriod="60 seconds">

b.上下文 contextName

每一個logger都關聯到logger上下文,默認上下文名稱爲「default」。但可使用<contextName>設置成其餘名字,用於區分不一樣應用程序的記錄。一旦設置,不能修改。

c.設置變量 property

用來定義變量值的標籤,<property> 有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。經過<property>定義的值會被插入到logger上下文中。定義變量後,可使${}來使用變量。

<configuration>
    <property name="CONTEXT_NAME" value="test"/>
    <contextName> ${CONTEXT_NAME} </contextName>
</configuration>

d.獲取時間戳字符串:<timestamp>

兩個屬性 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>

設置logger:

下面一大串文字的描述(網上copy來),簡單來講loger就是指定類or包的輸出級別

<level> 指定打印級別

<name> 指定包名or類名,或一個固定的約束條件

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

name: 用來指定受此loger約束的某一個包或者具體的某一個類。

level: 用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,表明強制執行上級的級別。 若是未設置此屬性,那麼當前loger將會繼承上級的級別。

addtivity: 是否向上級loger傳遞打印信息。默認是true。 <loger>能夠包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個loger。

<root>

也是<logger>元素,可是它是根loger。只有一個level屬性,應爲已經被命名爲"root".

level: 默認是DEBUG。

<root>能夠包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個loger。

如上面的java文件對應的配置能夠是下面的:

<logger name="com.mushroom.hui" level="INFO" />

<!--若是上面的JAVA中的logger獲取是:  -->
<!-- Logger logger = LoggerFactor.getLogger("logTest")-->
<logger name="logTest" level="DEBUG" />

e. append

上面的logger有一個 <append-ref> 的東西,從名字很容易看出就是一個引用 <append>

<appender><configuration>的子節點,是負責寫日誌的組件。

兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名。

下面是一個天天生成一個文件,保存30天的配置項

<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>   
    
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">   
      <maxFileSize>5MB</maxFileSize>  <!-- 當文件大於5MB時,分拆一下日誌文件-->
    </triggeringPolicy>   
   
    <encoder>   
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>   
    </encoder>   
  </appender>    
   
  <root level="DEBUG">   
    <appender-ref ref="FILE" />   
  </root>   
</configuration>
  1. append的兩個屬性
  • name: append的標識,logger或者root中使用 <append-ref> 指定的ref值
  • class: 有三種,ConsoleAppender(輸出到控制檯),FileAppender(輸出到文件), RollingFileAppender(先將日誌輸出到指定文件,知足必定條件後將日誌記錄到其餘文件中)
  1. ConsoleAppender & FileAppender

這兩個都比較簡單,直接上代碼說明

<configuration>  

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
  <encoder>  
    <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>  
  </encoder>  
</appender> 

<logger name="test" level="DEBUG" />

 <appender name="FILE" class="ch.qos.logback.core.FileAppender">  
  <file>testFile.log</file>  <!-- 文件名,這裏是相對路徑,也能夠指定絕對路徑 -->
  <append>true</append>  <!-- true 表示追加寫方式,默認就是true,所以這個常省略 -->
  <encoder>  
    <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>  
  </encoder>  
</appender>  

<root level="INFO">  
  <appender-ref ref="FILE" />  
</root>  
</configuration>
  1. RollingFileAppender 滾動記錄文件

如上面的天天記錄一個日誌文件,並保存30天,就是用搞這個模式來玩的,對比上面的兩個xml(主要看fileAppender與rollingFileAppender)

RollingPolicy 這個是主要關注點,用來指定滾動策略的

- TimeBasedRollingPolicy:根據時間來滾動,最多見的一種

    fileNamePattern: 文件名
    maxHistory: 最多保存的時間

- FixedWindowRollingPolicy: 根據固定窗口算法重命名文件的滾動策略

triggeringPolicy 根據文件大小進行拆日誌文件,當大於指定的文件時

SizeBasedTriggeringPolicy: 查看當前活動文件的大小,若是超過指定大小會告知      RollingFileAppender 觸發當前活動文件滾動。只有一個節點:
`<maxFileSize>`:這是活動文件的大小,默認值是10MB。

f. filter 過濾

配合appender使用,過濾日誌

過濾器,執行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日誌將當即被拋棄再也不通過其餘過濾器;返回NEUTRAL,有序列表裏的下個過濾器過接着處理日誌;返回ACCEPT,日誌會被當即處理,再也不通過剩餘過濾器。

  1. Level 級別過濾器

級別過濾器,根據日誌級別進行過濾。若是日誌級別等於配置級別,過濾器會根據onMath 和 onMismatch接收或拒絕日誌。有如下子節點:

<level>:設置過濾級別 <onMatch>:用於配置符合過濾條件的操做 <onMismatch>:用於配置不符合過濾條件的操做

  1. ThresholdFilter: 臨界值過濾器,

過濾掉低於指定臨界值的日誌。當日志級別等於或高於臨界值時,過濾器返回NEUTRAL;當日志級別低於臨界值時,日誌會被拒絕

<level>:設置過濾級別

  1. EvaluatorFilter: 求值過濾器,評估、鑑別日誌是否符合指定條件

不經常使用,有興趣官網走起

相關文章
相關標籤/搜索