Logback 是一個穩定、高效、快速的 Java 日誌框架,做爲 log4j 的改良版,它與 log4j 相比擁有更多特性,也帶來了很大的性能提高,具體改進能夠查看官方文檔。html
Logback 主要分爲三個模塊java
Logback 啓動加載時會按一下順序查找配置文件bash
當查找到任意一項配置存在後就不進行後續掃描了,會使用該配置文件進行初始化,若是沒有查找到配置文件,Logback會建立一個向控制檯輸出日誌的配置。app
configuration 是配置文件的根節點,有三個屬性:框架
配置代碼:異步
<configuration scan="true" scanPeriod="60 second" debug="true">
</configuration>
複製代碼
每一個 logger 都關聯到 logger 上下文,默認上下文名稱爲 「default」。但可使用<contextName>設置成其餘名字,用於區分不一樣應用程序的記錄。一旦設置,不能修改。性能
配置代碼:ui
<contextName>new context name</contextName>
複製代碼
property 是用來定義變量的標籤,設置以後能夠用 ${變量名} 訪問,有三個屬性:spa
配置代碼: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>
複製代碼
logger 用來設置某一個類或者某個包的日誌輸出級別、以及輸出位置(指定 appender),有三個屬性:
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 的值。
appender 是負責寫日誌的組件,有兩個屬性(使用時都必須配置):
appender 能夠包含零個或一個 layout ,零個或多個 encoder 元素以及零個或多個 filter 元素。除了這三個元素以外,還能夠包含與 appender 類的 JavaBean 屬性相對應的任意數量的元素,如: file 指定日誌文件名稱。
appender 經常使用的有如下幾種:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
<target>
System.err
</target>
</appender>
複製代碼
<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>
複製代碼
<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>
複製代碼
<!-- 異步輸出 -->
<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>
複製代碼