1. 程式人生 > >一篇文章學會日誌logback的使用

一篇文章學會日誌logback的使用

1、Logback為取代log4j而生

java日誌有:slf4j,log4j,logback,common-logging
slf4j:是規範/介面
日誌實現:log4j,logback,common-logging等
Logback是由log4j創始人Ceki Gülcü設計的又一個開源日誌元件。logback當前分成三個模組:logback-core,logback- classic和logback-access。

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId
>
slf4j-api</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.1.7</version> </dependency> <!--實現slf4j介面並整合-->
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.7</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId
>
<version>1.1.7</version> </dependency>

2、Logback的核心物件:Logger、Appender、Layout

Logback主要建立於Logger、Appender 和 Layout 這三個類之上。

  • Logger:日誌的記錄器,把它關聯到應用的對應的context上後,主要用於存放日誌物件,也可以定義日誌型別、級別。Logger物件一般多定義為靜態常量.
  • Appender:用於指定日誌輸出的目的地,目的地可以是控制檯、檔案、遠端套接字伺服器、 MySQL、 PostreSQL、Oracle和其他資料庫、 JMS和遠端UNIX Syslog守護程序等。
  • Layout:負責把事件轉換成字串,格式化的日誌資訊的輸出。

3、Level 有效級別

Logger可以被分配級別。級別包括:TRACE、DEBUG、INFO、WARN和ERROR,定義於ch.qos.logback.classic.Level類。程式會列印高於或等於所設定級別的日誌,設定的日誌等級越高,打印出來的日誌就越少。如果設定級別為INFO,則優先順序高於等於INFO級別(如:INFO、 WARN、ERROR)的日誌資訊將可以被輸出,小於該級別的如DEBUG將不會被輸出。為確保所有logger都能夠最終繼承一個級別,根logger總是有級別,預設情況下,這個級別是DEBUG。

4、 三值邏輯

Logback的過濾器基於三值邏輯(ternary logic),允許把它們組裝或成鏈,從而組成任意的複合過濾策略。過濾器很大程度上受到Linux的iptables啟發。這裡的所謂三值邏輯是說,過濾器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一個。

  • 如果返回DENY,那麼記錄事件立即被拋棄,不再經過剩餘過濾器;

  • 如果返回NEUTRAL,那麼有序列表裡的下一個過濾器會接著處理記錄事件;

  • 如果返回ACCEPT,那麼記錄事件被立即處理,不再經過剩餘過濾器。

5、Filter 過濾器

Logback-classic提供兩種型別的過濾器:常規過濾器和TuroboFilter過濾器。Logback整體流程:

  • Logger 產生日誌資訊;
  • Layout修飾這條msg的顯示格式;
  • Filter過濾顯示的內容;
  • Appender具體的顯示,即儲存這日誌資訊的地方。

LogBack配置檔案:logback.xml

檔案存放在resources目錄下:

<configuration>
     <!--輸出console-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--輸出格式-->
        <encoder>
            <pattern>%d{HH:mm:ss} %-5level [%thread] %logger{36}.%M - %msg%n
            </pattern>
        </encoder>
    </appender>
    <!--輸出到檔案-->
    <appender name="MQTTPubFILE"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--訊息過濾 debug執行日誌,否則拋棄-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY </onMismatch>
        </filter>
        <!--日誌輸出的檔名,路徑專案根目錄-->
        <file>mqttPub.log</file>
        <!--時間回滾,當天的記錄記錄在當天的已時間命名的檔案中-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>mqttPub.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- keep 3 days' worth of history -->
            <maxHistory>3</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss} %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="類路徑" level="debug">
        <!--指定日誌輸出方式,引用定義的appender-->
        <appender-ref ref="MQTTSubFILE" />
    </logger>
<!-- 日誌輸出規則 根據當前ROOT 級別,日誌輸出時,級別高於root預設的級別時 會輸出 -->
   <!-- 列印info級別日誌及以上級別日誌 -->
    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

即當root為info級別時,在程式碼中通過logger指定的輸出級別低於info時,日誌是不會輸出的.
最終決定你日誌輸出級別的是你在具體程式碼中呼叫Logger類決定的,而不是<logger>標籤,但是你的Logger呼叫級別不能低於標籤指定的級別.也意味著如果你的logger標籤沒有指定級別,那麼程式碼中輸出日誌時不能低於root標籤的級別
root 是日誌級別的最高階,如果定義一個logger沒有指定level那麼模式繼承root的級別。同時日誌預設會向上傳遞,即自己定義的logger執行完成後會交給root處理,也就是此時該日誌會被處理兩次:你自己的日誌一次,root處理一次,但可以通過設定additivity屬性來避免(預設為true):

 <logger name="logback.LogbackDemo" level="INFO" additivity="false">  
    <appender-ref ref="STDOUT"/>  
  </logger>   

LogBack在程式碼中的使用:

private static final Logger logger = LoggerFactory.getLogger(xxx.class);
logger.debug(xxx);