Logback配置文件詳解
Logback,Java 日志框架。
Logback 如何加載配置的
- logback 首先會查找 logback.groovy 文件
- 當沒有找到,繼續試着查找 logback-test.xml 文件
- 當沒有找到時,繼續試着查找 logback.xml 文件
- 如果仍然沒有找到,則使用默認配置(打印到控制台)
configuration
configuration 是配置文件的根節點,他包含的屬性:
- scan
當此屬性設置為 true 時,配置文件如果發生改變,將會被重新加載,默認值為 true - scanPeriod
設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。但 scan 為 true 時,此屬性生效,默認的時間間隔為 1 分鍾 - debug
當此屬性設置為 true 時,將打印出 logback 內部日志信息,實時查看 logback 運行狀態,默認值為 false。
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 其他配置省略-->
</configuration>
configuration 的子節點
設置上下文名稱:contextName
每個 logger 度關聯到 logger 上下文,默認上下文名稱為 “default”。可以通過設置 contextName 修改上下文名稱,用於區分不同應該程序的記錄
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>myAppName</contextName>
<!-- 其他配置省略-->
</configuration>
設置變量:property
用於定義鍵值對的變量, property 有兩個屬性 name 和 value,name 是鍵,value 是值,通過 property 定義的鍵值對會保存到logger 上下文的 map 集合內。定義變量后,可以使用 “${}” 來使用變量
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_Name" value="myAppName" />
<contextName>${APP_Name}</contextName>
<!-- 其他配置省略-->
</configuration>
獲取時間戳字符串:timestamp
timestamp 有兩個屬性,key:標識此 timestamp 的名字;datePattern:時間輸出格式,遵循SimpleDateFormat 的格式
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<contextName>${bySecond}</contextName>
<!-- 其他配置省略-->
</configuration>
logger
logger 有兩種級別,一種是 root,一種是普通的 logger,logger 是用來設置某一個包或者具體的某一個類的日志打印機級別,以及制定的 appender。
logger 有三個屬性
- name:用來指定此 logger 約束的某一個包或者具體的某一個類
- level:用來設置打印機別,
- addtivity:是否向上級 logger 傳遞打印信息。默認是 true
每個 logger 都有對應的父級關系,它通過包名來決定父級關系,root 是最高級的父元素。
下面定義了四個 logger,他們的父子關系從小到大為:
com.lwc.qg.test.logbackDemo → com.lwc.qg.tes → com.lwc.qg → root
<!-- 根 logger -->
<root level="info">
<appender-ref ref="STDOUT"/>
</root>
<!--
普通的 logger
name:類名或包名,標志該 logger 與哪個包或哪個類綁定
level:該 logger 的日志級別
additivity:是否將日志信息傳遞給上一級
-->
<logger name="com.lwc.qg.test.logbackDemo" level="debug" additivity="true">
<appender-ref ref="STDOUT"/>
</logger>
<logger name="com.lwc.qg.test" level="info" additivity="true">
<appender-ref ref="STDOUT"/>
</logger>
<logger name="com.lwc.qg" level="info" additivity="true">
<appender-ref ref="STDOUT"/>
</logger>
從該種級別來看,如果此時在最低層的 logger 輸出日志信息,以該配置作為基礎,它將會向父級的所有 logger 依次傳遞,所以按理來說一個打印信息將會打印四次
從控制台上看,的確每條日志信息都被打印出了四次,但是細心從配置文件上來看,root 的日志級別配置的為 info,但是卻輸出 debug 級別的日志信息,所以從測試結果可以看出,向上傳遞的日志信息的日志級別將由最底層的子元素決定(最初傳遞信息的 logger),因為子元素設置的日志級別為 debug,所以也輸出了 debug 級別的信息。
因此,從理論上來說,如果子元素日志級別設置高一點,那么也將會只輸出高級別的日志信息。實際上也是如此,如果我們把 com.lwc.qg.test.logbackDemo 對應的 logger 日志級別設為 warn,那么將只會輸出 warn 及其以上的信息
root
root 也是 logger 元素,但它是根 logger。只有一個 level 屬性
appender
appender 是負責寫日志的組件,常用的組件有:
- ConsoleAppender
- FileAppender
- RollingFileAppender
ConsoleAppender
控制台日志組件,該組件將日志信息輸出到控制台,該組件有以下節點
- encoder:對日志進行格式化
- target:System.out 或者 System.err,默認是 System.out
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
<target>System.out</target>
</appender>
FileAppender
文件日志組件,該組件將日志信息輸出到日志文件中,該組件有以下節點
- file:被寫入的文件名,可以是相對路徑,也可以是絕對路徑。如果上級目錄不存在會自動創建,沒有默認值
- append:如果是 true,日志被追加到文件結尾;如果是 false,清空現存文件,默認是 true。
- encoder:格式化
- prudent:如果是 true,日志會被安全的寫入文件,即使其他的 FileAppender 也在向此文件做寫入操作,效率低,默認是 false。
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
<prudent>true</prudent>
</appender>
RollingFileAppender
滾動記錄文件日志組件,先將日志記錄記錄到指定文件,當符合某個條件時,將日志記錄到其他文件,該組件有以下節點
- file:文件名
- encoder:格式化
- rollingPolicy:當發生滾動時,決定 RollingFileAppender 的行為,涉及文件移動和重命名
- triggeringPolicy:告知 RollingFileAppender 合適激活滾動
- prudent:當為true時,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有兩個限制,1不支持也不允許文件壓縮,2不能設置file屬性,必須留空。
rollingPolicy
滾動策略
-
TimeBasedRollingPolicy:最常用的滾動策略,它根據時間來制定滾動策略,即負責滾動也負責觸發滾動,包含節點:
- fileNamePattern:文件名模式
- maxHistoury:控制文件的最大數量,超過數量則刪除舊文件
-
FixedWindowRollingPolicy:根據固定窗口算法重命名文件的滾動策略,包含節點
- minInedx:窗口索引最小值
- maxIndex:串口索引最大值,當用戶指定的窗口過大時,會自動將窗口設置為12
- fileNamePattern:文件名模式,必須包含%i,命名模式為 log%i.log,會產生 log1.log,log2.log 這樣的文件
-
triggeringPolicy:根據文件大小的滾動策略,包含節點
- maxFileSize:日志文件最大大小
<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>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
filter 過濾器
過濾器是用於日志組件中的,每經過一個過濾器都會返回一個確切的枚舉值,分別是
- DENY:返回 DENY,日志將立即被拋棄不再經過其他過濾器
- NEUTRAL:有序列表的下個過濾器接着處理日志
- ACCEPT:日志會被立即處理,不再經過剩余過濾器
常用過濾器
常用的過濾器有以下:
- LevelFilter
級別過濾器,根據日志級別進行過濾。如果日志級別等於配置級別,過濾器會根據 omMatch 和 omMismatch 接受或拒絕日志。他有以下節點
level:過濾級別
onMatch:配置符合過濾條件的操作
onMismatch:配置不符合過濾條件的操作
例:該組件設置一個 INFO 級別的過濾器,那么所有非 INFO 級別的日志都會被過濾掉
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
<target>System.out</target>
</appender>
- ThresholdFilter
臨界值過濾器,過濾掉低於指定臨界值的日志。當日志級別等於或高於臨界值時,過濾器會返回 NEUTRAL;當日志級別低於臨界值時,日志會被拒絕
例:過濾掉所有低於 INFO 級別的日志
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
<target>System.out</target>
</appender>
- EvaluatorFilter
求值過濾器,評估、鑒別日志是否符合指定條件,包含節點:
evaluator:鑒別器,通過子標簽 expression 配置求值條件
onMatch:配置符合過濾條件的操作
onMismatch:配置不符合過濾條件的操作