- 跑起來
- 配置項
- 工做原理
巴拉巴拉。。。 (爲何這麼玩,有什麼好處 google it)html
說明: 本篇主要偏應用爲主,介紹瞭如何使用logback, 以及相關的配置,對於這個東西的實現原理以及工做機制,沒有涉入; 此外大部份內容來源於互聯網,博客,這裏只是給了一個梳理和小結,方便一鍵式接入java
官方文檔 http://logback.qos.ch/manual/index.html算法
maven依賴:app
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency>
代碼中使用方式maven
package com.mushroom.hui; public class LogTest { private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory(LogTest.class); @Test public void logTest() { logger.info("hello wolrd! This is in method {}, print by {}", "logTest", "yihui"); } }
完成上面的這些,測試一下,發現控制檯沒有任何輸出,由於缺了配置文件測試
配置文件在log4j裏一般叫作log4j.xml,在logback裏是logback.xml,或者,在測試環境裏叫作logback-test.xml。ui
在Maven project裏,logback.xml文件必須放在$PROJECT_HOME/src/main/resources目錄中。logback-test.xml文件必須放在$PROJECT_HOME/src/test/resources目錄中google
ok,在測試工程中添加一個 logback-test.xml 配置文件:lua
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration>
順帶提一句,xml加載順序是: logback.groovy -> logback.xml -> logback-test.xml -> default(默認)debug
上面就有一個簡單的配置文件,首先對出現的幾個節點(<節點>)進行說明
從這霸氣的名字能夠看出,這貨就是根節點,定義一些配置相關信息
scan: 當此屬性設置爲true時,配置文件若是發生改變,將會被從新加載,默認值爲true。
scanPeriod: 設置監測配置文件是否有修改的時間間隔,若是沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。
debug: 當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。
<!-- 部署出logback內部日誌信息,每隔60s判斷一下配置文件有沒有個更新,若更新,則從新加載 --> <configuration debug="false" scan="true" scanPeriod="60 seconds">
每一個logger都關聯到logger上下文,默認上下文名稱爲「default」。但可使用<contextName>設置成其餘名字,用於區分不一樣應用程序的記錄。一旦設置,不能修改。
用來定義變量值的標籤,<property> 有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。經過<property>定義的值會被插入到logger上下文中。定義變量後,可使${}
來使用變量。
<configuration> <property name="CONTEXT_NAME" value="test"/> <contextName> ${CONTEXT_NAME} </contextName> </configuration>
<timestamp>
兩個屬性 key:標識此<timestamp>
的名字;datePattern:設置將當前時間(解析配置文件的時間)轉換爲字符串的模式,遵循java.txt.SimpleDateFormat的格式
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/> <contextName>${bySecond}</contextName> <!-- 其餘配置省略--> </configuration>
下面一大串文字的描述(網上copy來),簡單來講loger就是指定類or包的輸出級別
<level>
指定打印級別
<name>
指定包名or類名,或一個固定的約束條件
<logger>
用來設置某一個包或者具體的某一個類的日誌打印級別、以及指定<appender>
。<logger>
僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
name: 用來指定受此loger約束的某一個包或者具體的某一個類。
level: 用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,表明強制執行上級的級別。 若是未設置此屬性,那麼當前loger將會繼承上級的級別。
addtivity: 是否向上級loger傳遞打印信息。默認是true。 <loger>能夠包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個loger。
<root>
也是<logger>
元素,可是它是根loger。只有一個level屬性,應爲已經被命名爲"root".
level: 默認是DEBUG。
<root>
能夠包含零個或多個<appender-ref>
元素,標識這個appender將會添加到這個loger。
如上面的java文件對應的配置能夠是下面的:
<logger name="com.mushroom.hui" level="INFO" /> <!--若是上面的JAVA中的logger獲取是: --> <!-- Logger logger = LoggerFactor.getLogger("logTest")--> <logger name="logTest" level="DEBUG" />
上面的logger有一個 <append-ref>
的東西,從名字很容易看出就是一個引用 <append>
<appender>
是<configuration>
的子節點,是負責寫日誌的組件。兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名。
下面是一個天天生成一個文件,保存30天的配置項
<configuration> <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> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>5MB</maxFileSize> <!-- 當文件大於5MB時,分拆一下日誌文件--> </triggeringPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="FILE" /> </root> </configuration>
<append-ref>
指定的ref值這兩個都比較簡單,直接上代碼說明
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> </encoder> </appender> <logger name="test" level="DEBUG" /> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>testFile.log</file> <!-- 文件名,這裏是相對路徑,也能夠指定絕對路徑 --> <append>true</append> <!-- true 表示追加寫方式,默認就是true,所以這個常省略 --> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="FILE" /> </root> </configuration>
如上面的天天記錄一個日誌文件,並保存30天,就是用搞這個模式來玩的,對比上面的兩個xml(主要看fileAppender與rollingFileAppender)
RollingPolicy 這個是主要關注點,用來指定滾動策略的
- TimeBasedRollingPolicy:根據時間來滾動,最多見的一種 fileNamePattern: 文件名 maxHistory: 最多保存的時間 - FixedWindowRollingPolicy: 根據固定窗口算法重命名文件的滾動策略
triggeringPolicy 根據文件大小進行拆日誌文件,當大於指定的文件時
SizeBasedTriggeringPolicy: 查看當前活動文件的大小,若是超過指定大小會告知 RollingFileAppender 觸發當前活動文件滾動。只有一個節點: `<maxFileSize>`:這是活動文件的大小,默認值是10MB。
配合appender使用,過濾日誌
過濾器,執行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日誌將當即被拋棄再也不通過其餘過濾器;返回NEUTRAL,有序列表裏的下個過濾器過接着處理日誌;返回ACCEPT,日誌會被當即處理,再也不通過剩餘過濾器。
級別過濾器,根據日誌級別進行過濾。若是日誌級別等於配置級別,過濾器會根據onMath 和 onMismatch接收或拒絕日誌。有如下子節點:
<level>
:設置過濾級別 <onMatch>
:用於配置符合過濾條件的操做 <onMismatch>
:用於配置不符合過濾條件的操做
過濾掉低於指定臨界值的日誌。當日志級別等於或高於臨界值時,過濾器返回NEUTRAL;當日志級別低於臨界值時,日誌會被拒絕
<level>
:設置過濾級別
不經常使用,有興趣官網走起