Logback,Java 日誌框架。算法
Logback 如何加載配置的express
configuration 是配置文件的根節點,他包含的屬性:安全
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 其餘配置省略-->
</configuration>
每一個 logger 度關聯到 logger 上下文,默認上下文名稱爲 「default」。能夠經過設置 contextName 修改上下文名稱,用於區分不一樣應該程序的記錄app
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>myAppName</contextName>
<!-- 其餘配置省略-->
</configuration>
用於定義鍵值對的變量, 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 有兩個屬性,key:標識此 timestamp 的名字;datePattern:時間輸出格式,遵循SimpleDateFormat 的格式測試
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<contextName>${bySecond}</contextName>
<!-- 其餘配置省略-->
</configuration>
logger 有兩種級別,一種是 root,一種是普通的 logger,logger 是用來設置某一個包或者具體的某一個類的日誌打印機級別,以及制定的 appender。
logger 有三個屬性lua
每一個 logger 都有對應的父級關係,它經過包名來決定父級關係,root 是最高級的父元素。
下面定義了四個 logger,他們的父子關係從小到大爲:
com.lwc.qg.test.logbackDemo → com.lwc.qg.tes → com.lwc.qg → rootspa
<!-- 根 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 依次傳遞,因此按理來講一個打印信息將會打印四次debug
從控制檯上看,的確每條日誌信息都被打印出了四次,可是細心從配置文件上來看,root 的日誌級別配置的爲 info,可是卻輸出 debug 級別的日誌信息,因此從測試結果能夠看出,向上傳遞的日誌信息的日誌級別將由最底層的子元素決定(最初傳遞信息的 logger),由於子元素設置的日誌級別爲 debug,因此也輸出了 debug 級別的信息。
所以,從理論上來講,若是子元素日誌級別設置高一點,那麼也將會只輸出高級別的日誌信息。實際上也是如此,若是咱們把 com.lwc.qg.test.logbackDemo 對應的 logger 日誌級別設爲 warn,那麼將只會輸出 warn 及其以上的信息日誌
root 也是 logger 元素,但它是根 logger。只有一個 level 屬性
appender 是負責寫日誌的組件,經常使用的組件有:
控制檯日誌組件,該組件將日誌信息輸出到控制檯,該組件有如下節點
<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>
文件日誌組件,該組件將日誌信息輸出到日誌文件中,該組件有如下節點
<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>
滾動記錄文件日誌組件,先將日誌記錄記錄到指定文件,當符合某個條件時,將日誌記錄到其餘文件,該組件有如下節點
滾動策略
TimeBasedRollingPolicy:最經常使用的滾動策略,它根據時間來制定滾動策略,即負責滾動也負責觸發滾動,包含節點:
FixedWindowRollingPolicy:根據固定窗口算法重命名文件的滾動策略,包含節點
triggeringPolicy:根據文件大小的滾動策略,包含節點
<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>
過濾器是用於日誌組件中的,每通過一個過濾器都會返回一個確切的枚舉值,分別是
經常使用的過濾器有如下:
<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>
<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>