logback使用(springboot 和springmvc)

Logback介紹

     Logback是log4j的後續版本。 它是由log4j的創始人Ceki Gülcü設計的。logback比所有現有的日誌系統都要快,而且佔用的空間也比所有現有的日誌系統都要小。同樣重要的是,logback提供了在其他日誌系統中缺少的獨特而有用的特性。

參考地址 https://logback.qos.ch/manual/architecture.html  

Logback架構

     在當前時間, Logback 分爲三個模塊, logback-core, logback-classic, logback-access。core模塊是其他模塊的基礎。classic模塊相當於一個改進版的log4j。

     Logback建立三個主要的類上:Logger 打印日誌 Appender 輸出源(日誌輸入到什麼地方),Layout(日誌的佈局)。這三種類型的組件協同工作,使開發人員可以根據消息類型和級別來記錄消息,並在運行時控制這些消息的格式以及報告的位置。

Logger

  負責日誌的打印,分爲五個等級(從低到高TRACE, DEBUG, INFO, WARN and ERROR),如何沒有分配等級,則選擇祖先的等級。爲了確保每個logger都有等級,root looger 分配一個default 爲debug的等級。下面例子顯示的是分配的日誌級別,以及最終起作用的級別。

例 1 (沒有指定,使用root的級別)

Logger  名 分配的級別 起作用的級別
root DEBUG DEBUG
X none DEBUG
X.Y none DEBUG
X.Y.Z none DEBUG

例 2(指定,則使用指定的級別)

Logger 名 分配的級別 起作用的級別
root ERROR ERROR
X INFO INFO
X.Y DEBUG DEBUG
X.Y.Z WARN WARN

例 3(x.y沒指定,則使用直接祖先的級別)

Logger 名 分配的級別 起作用的級別
root DEBUG DEBUG
X INFO INFO
X.Y none INFO
X.Y.Z ERROR ERROR

例 4(沒指定,則使用直接祖先的級別)

Logger name 分配的級別 起作用的級別
root DEBUG DEBUG
X INFO INFO
X.Y none INFO
X.Y.Z none INFO

上面說過說過日誌級別從低到高爲  TRACE < DEBUG < INFO <  WARN < ERROR.如果定義了高日誌級別,低日誌級不打印,不起作用。

Appender

  它負責將日誌事件以合適的格式輸出到指定的地方:console控制檯,文件(.log,.html,.txt格式),mysql數據庫。定義輸出源必須要實現Appender 接口,核心抽象方法是doAppend(E event)。logback已經給我提供了實現的接口,我們直接使用就行了

Encoders

  編碼器負責將一個事件轉換爲一個字節數組,並將字節數組寫入輸出流中。

Layouts

佈局是用於將傳入事件轉換爲字符串的邏輯組件。

filter 

對日誌級別過濾。下面介紹幾個常用的類:

ThreSholdFilter ,入門級過濾。對於小於該日誌級別的日誌就行過濾,如下配置,雖然指定日誌級別爲debug,但是>=info 級別的日誌,纔會被打印

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
   <level>info</level>
</filter>
<root level="Debug">

EvaluatorFilter,通用的校驗過濾。對EventEvaluator事件校驗器進行了封裝。這裏我們使用EventEvaluator 的子類JaninoEventEvaluator,該類可以使用java 語言寫過濾表達式,對我們java程序員來說,非常便利。腳本如下:


      <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
  <!--默認事件校驗使用的就是JaninoEventEvaluator,evaluator  可以不顯示指定JaninoEventEvaluator-->    
            <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
                <expression>
            <!-- 該過濾表達式意思是,如果root 日誌級別大於debug,則輸入,如果不是,則輸入我們自己定義com.test包下的日誌。所依賴的三方jar包debug日誌不輸出。三方jar包產生的日誌是對我們調試是沒有幫助的,冗餘的,因此過濾掉-->
                if(level > DEBUG){
                    return true;
                    }
                    return logger.contains("com.test");
                </expression>
            </evaluator>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>


注意,JaninoEventEvaluator依賴Janino jar包,因此,使用前,maven/gradle 要加入下面依賴:

compile 'org.codehaus.janino:janino:3.0.6'


配置文件


下面是一個logback的配置例子,裏面包含了生產用到的配置,並對配置進行了詳細的說明。創建一個logback.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
#10秒監測一次配置文件,如果改動,則重新加載配置,這在測試和生產上都比較有用
<configuration scan="true" scanPeriod="10 seconds">
    <!--<timestamp key="bySecond" datePattern="YYYY-MM-dd"/>-->

<!--logback提供了輸出到文件的輸出源,直接使用RollingFileAppender輸出源可對文件進行轉換(特定情況下,對日誌進行處理)。-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--實時日誌輸出路徑-->
    <file>../logs/ctest.log</file>
   <!--轉換日誌策略-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <!--轉換模式,日誌按天以test-2017-07-06.log形式存儲,最多存30天,30天之後自動刪除,所有日誌文件總大小不能超過10GB,如果超過則最老的文件會被刪除-->
      <fileNamePattern>../logs/test-%d{YYYY-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>
      <totalSizeCap>10GB</totalSizeCap>
    </rollingPolicy>
   

 <!--日誌是否立即輸出,設爲true則,立即輸出日誌,如果程序退出,日誌不會丟失,但是性能會比在false情況下慢四倍-->
 <immediateFlush>false</immediateFlush>
  <!--日誌輸入格式化,從左到右依次爲: 
 輸出時間;日誌級別;生成日誌事件的當前線程;對生成器包名進行簡化com.test.HomeController 會打印成c.t.HomeController;日誌請求的文件,及所在的行號,會影響性能,建議不要配置;打印日誌消息,換行
--> 
   <encoder>
            <pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
    </encoder>
    </appender>
<!--輸出到控制檯-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 和上面格式化一樣,唯一區別是對控制檯日誌內容加了顏色,-->
        <encoder>
            <pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
        </encoder>
    </appender>
<!--指定一個root 的日誌級別爲info,指定上面兩個輸出源繼承root日誌級別-->
    <root level="info">
        <appender-ref ref="STDOUT" />
         <appender-ref ref="FILE" />
    </root>
<!--指定對應包下的class日誌級別,和EvaluatorFilter作用相同-->
<logger name="com.test" level="WARN">
</configuration>


使用

 logback使用很簡單,加入依賴,將logback.xml文件丟到項目裏即可。下面介紹springboot和springmvc的兩種框架下的使用方法。

 springboot

    我們項目開發中使用的springboot框架,springboot默認使用的logback框架,只要將上述文件名修改爲logback-spring.xml(springboot建議在文件名上加-spring)。放到src/main/resources目錄下。啓動程序,打印日誌如下:

017-07-06 19:43:06.574 [main] INFO  o.a.tomcat.util.net.NioSelectorPool - Using a shared selector for servlet write/read
2017-07-06 19:43:06.591 [main] INFO  o.s.b.c.e.t.TomcatEmbeddedServletContainer - Tomcat started on port(s): 82 (http)
2017-07-06 19:43:06.596 [main] INFO  com.test.TestApplication - Started TestApplication in 14.101 seconds (JVM running for 14.721)

 springmvc

     gradle 或maven中加入以下依賴:

gradle

def logback.version = '1.2.3'
def slf4j.version = '1.7.21'

dependencies {  
  compile "ch.qos.logback:logback-core:${logback.version}"
  compile "ch.qos.logback:logback-classic:${logback.version}"
  compile "org.slf4j:slf4j-api:${slf4j.version}"
#使用filter才需引用這個jar
  compile 'org.codehaus.janino:janino:3.0.6'
}

maven 

  <properties>
         <logback.version>1.2.3</logback.version>
         <slf4j.version>1.7.21</slf4j.version>
  </properties>
 <dependencies>
        <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>       
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency> 

        <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>janino</artifactId>
            <version>3.0.6</version>
        </dependency> 
</dependencies>


  然後將logback.xml 放入src/main/resources目錄下啓動即可。啓動即可看到配置日誌已經生效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章