Java 日誌框架 Logback

Logback 簡介

Logback 是一個穩定、高效、快速的 Java 日誌框架,做爲 log4j 的改良版,它與 log4j 相比擁有更多特性,也帶來了很大的性能提高,具體改進能夠查看官方文檔html

Logback 主要分爲三個模塊java

  • logback-core:核心模塊,做爲 classic 和 access 模塊的基礎
  • logback-classic:實現了 slf4j API,配合 slf4j 使用,能夠方便的切換其餘日誌框架
  • logback-access:​​與Servlet容器(如Tomcat和Jetty)集成,提供了 HTTP 訪問日誌接口

Logback 加載

Logback 啓動加載時會按一下順序查找配置文件bash

  1. 在系統配置文件 System Properties 中尋找是否有 logback.configurationFile 對應的 value
  2. 在 classpath 下尋找是否有 logback.groovy(logback支持groovy與xml兩種配置方式)
  3. 在 classpath 下尋找是否有 logback-test.xml
  4. 在 classpath 下尋找是否有 logback.xml

當查找到任意一項配置存在後就不進行後續掃描了,會使用該配置文件進行初始化,若是沒有查找到配置文件,Logback會建立一個向控制檯輸出日誌的配置。app

Logback 配置

根節點 configuration

configuration 是配置文件的根節點,有三個屬性:框架

  • debug:默認值爲false,設置爲true時,將打印出 logback 內部日誌信息,實時查看 logback 運行狀態。
  • scan:默認值爲true,設置爲true時,配置文件若是發生改變,將會被從新加載。
  • scanPeriod:當 scan 爲 true 時,此屬性纔會生效。設置掃描配置文件是否有修改的時間間隔,默認單位是毫秒。默認的時間間隔爲1分鐘(60 second)

配置代碼:異步

<configuration scan="true" scanPeriod="60 second" debug="true">
</configuration>
複製代碼

設置上下文名稱 contextName

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

配置代碼:ui

<contextName>new context name</contextName>
複製代碼

設置變量 property

property 是用來定義變量的標籤,設置以後能夠用 ${變量名} 訪問,有三個屬性:spa

  • name:變量名稱
  • value:變量值
  • file:指定配置文件的路徑,它的做用在於,若是有多個配置信息的話,能夠直接寫在配置文件中,而後經過file引入
  • resource:做用與 file 同樣,不一樣的是它能夠直接從 classpath 路徑下引入配置文件

配置代碼:debug

<!-- name value 形式 -->
<property name="APP_Name" value="MyApp"/>
<contextName>${APP_Name}</contextName>  
複製代碼
<!-- file 形式 -->
variables.properties:
APP_Name=MyApp
LOG_PATH=logs

<property file="src/main/java/config/variables.properties" />
<contextName>${APP_Name}</contextName> 
複製代碼
<!-- resource 形式 -->
variables.properties:
APP_Name=MyApp
LOG_PATH=logs

<property resource="variables.properties" />
<contextName>${APP_Name}</contextName> 
複製代碼

configuration 子節點 logger、root

logger 用來設置某一個類或者某個包的日誌輸出級別、以及輸出位置(指定 appender),有三個屬性:

  • name:指定的包名或者類名
  • level:輸出日誌級別,若是未設置此級別,那麼當前 logger 會向上繼承最近一個非空級別,root 默認有一個 level 爲 debug
  • additivity:是否將日誌向上級傳遞,默認爲 true

logger 經過設置子節點 appender-ref 來指定日誌輸出位置,一個 logger 能夠設置多個 appender-ref
配置代碼:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>[%d{HH:mm:ss.SSS}] [%5level] [%thread] %logger{36} %msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
</appender>
<logger name="X" level="INFO" additivity="false">
        <appender-ref ref="STDOUT"/>
</logger>
<logger name="X.Y" additivity="false">
    <appender-ref ref="STDOUT"/>
</logger>
複製代碼

root 是一個特殊的 logger , 是全部 logger 的根節點,由於已經被命名爲 root 同時也沒有父級別,因此只有一個屬性 level,默認爲 DEBUG
配置代碼:

<root level="DEBUG">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="ASYNC"/>
</root>
複製代碼

level 繼承示例1:

logger name level 實際 level
root DEBUG DEBUG
X 未設置 DEBUG
X.Y 未設置 DEBUG
X.Y.Z 未設置 DEBUG

示例1只有 root 設置了一個級別,X,X.Y 和 X.Y.Z 這三個 logger 未設置日誌輸出級別,所以向上繼承 root 的級別,即 DEBUG

level 繼承示例2:

logger name level 實際 level
root ERROR ERROR
X INFO INFO
X.Y DEBUG DEBUG
X.Y.Z WARN WARN

示例2全部 logger 都設置了一個日誌級別,等級繼承不起做用。

level 繼承示例3:

logger name level 實際 level
root DEBUG DEBUG
X INFO INFO
X.Y 未設置 INFO
X.Y.Z WARN WARN

示例3 X.Y 沒有設置日誌級別,向上繼承最近一個有日誌級別的 logger X 的值。

level 繼承示例4:

logger name level 實際 level
root DEBUG DEBUG
X INFO INFO
X.Y 未設置 INFO
X.Y.Z 未設置 INFO

示例4 X.Y 和 X.Y.Z 沒有設置日誌級別,向上繼承最近一個有日誌級別的 logger X 的值。

configuration 子節點 appender

appender 是負責寫日誌的組件,有兩個屬性(使用時都必須配置):

  • name:設置 appender 的名稱,供後面 logger 設置引用
  • class:設置 appender 的全路徑類名,例:ch.qos.logback.core.ConsoleAppender

appender 能夠包含零個或一個 layout ,零個或多個 encoder 元素以及零個或多個 filter 元素。除了這三個元素以外,還能夠包含與 appender 類的 JavaBean 屬性相對應的任意數量的元素,如: file 指定日誌文件名稱。

  • layout:對日誌進行格式化
  • encoder: encoder 是0.9.19版本以後引進的,之前的版本使用 layout ,logback極力推薦的是使用 encoder 而不是 layout
  • filter:對日誌進行過濾

appender 經常使用的有如下幾種:

  1. ConsoleAppender:輸出到控制檯,或者更確切地說是輸出到 System.out 或 System.err,前者是默認目標。
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
    <target>
        System.err
    </target>
</appender>
複製代碼
  1. FileAppender:輸出到文件,目標文件由 file 指定。若是該文件已存在,則根據 append 屬性的值肯定追加或者清空文件。
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>testFile.log</file>
    <append>true</append>
    <!-- set immediateFlush to false for much higher logging throughput -->
    <immediateFlush>true</immediateFlush>
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
</appender>
複製代碼
  1. RollingFileAppender:繼承自 FileAppender ,提供了滾動記錄的功能,先將日誌記錄到指定文件,當觸發某個條件時,將日誌記錄到其餘文件。有兩個重要的子節點 rollingPolicy 和 triggeringPolicy
  • rollingPolicy:指定發生滾動時 RollingFileAppender 的行爲,例如能夠切換日誌文件
  • triggeringPolicy:指定 RollingFileAppender 什麼時候觸發滾動。
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logFile.log</file>
    <!-- 根據時間來制定滾動策略,既負責滾動也負責觸發滾動。 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 天天生成日誌文件 -->
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>

      <!-- 保留最近30天的日誌文件 -->
      <maxHistory>30</maxHistory>
      <totalSizeCap>3GB</totalSizeCap>

    </rollingPolicy>

    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
</appender> 

<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <!-- 基於文件大小和時間的滾動策略 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- 天天生成日誌文件 -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- 每一個日誌文件最多 100MB, 保留 60 天, 最多 20 GB-->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
</appender>
複製代碼
  1. AsyncAppender:異步記錄日誌,它僅僅做爲一個調度者,所以必須引用另外一個 appender 來作日誌輸出。
  • discardingThreshold:默認狀況下,當阻塞隊列剩餘容量爲20%時,它將丟棄級別爲 TRACE,DEBUG 和 INFO 的事件,僅保留級別爲 WARN 和 ERROR 的事件。設置爲0便可保留全部事件。
  • queueSize:阻塞隊列的最大容量。默認狀況下,queueSize 爲 256。
  • appender-ref:表示 AsyncAppender 使用哪一個具體的 appender 進行日誌輸出。
<!-- 異步輸出 -->  
<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">  
        <!-- 不丟失日誌 -->  
        <discardingThreshold>0</discardingThreshold>  
        <!-- 更改默認的隊列的深度,該值會影響性能.默認值爲256 -->  
        <queueSize>256</queueSize>  
        <!-- 添加附加的appender,最多隻能添加一個 -->  
        <appender-ref ref ="FILE"/>  
</appender>
     
<logger name="X" level="DEBUG">
    <appender-ref ref="ASYNC" />
</logger>
複製代碼
相關文章
相關標籤/搜索