Logback介紹
Logback是log4j的後續版本。 它是由log4j的創始人Ceki Gülcü設計的。logback比所有現有的日誌系統都要快,而且佔用的空間也比所有現有的日誌系統都要小。同樣重要的是,logback提供了在其他日誌系統中缺少的獨特而有用的特性。
參考地址 https://logback.qos.ch/manual/architecture.html
Logback架構
在當前時間, Logback 分爲三個模塊, logback-core, logback-classic, logback-access。core模塊是其他模塊的基礎。classic模塊相當於一個改進版的log4j。
Logback建立三個主要的類上:Logger 打印日誌 ,Appender 輸出源(日誌輸入到什麼地方),Layout(日誌的佈局)。這三種類型的組件協同工作,使開發人員可以根據消息類型和級別來記錄消息,並在運行時控制這些消息的格式以及報告的位置。
Logger
負責日誌的打印,分爲五個等級(從低到高TRACE, DEBUG, INFO, WARN and ERROR),如何沒有分配等級,則選擇祖先的等級。爲了確保每個logger都有等級,root looger 分配一個default 爲debug的等級。下面例子顯示的是分配的日誌級別,以及最終起作用的級別。
例 1 (沒有指定,使用root的級別)
Logger 名 | 分配的級別 | 起作用的級別 |
---|---|---|
root | DEBUG | DEBUG |
X | none | DEBUG |
X.Y | none | DEBUG |
X.Y.Z | none | DEBUG |
例 2(指定,則使用指定的級別)
Logger 名 | 分配的級別 | 起作用的級別 |
---|---|---|
root | ERROR | ERROR |
X | INFO | INFO |
X.Y | DEBUG | DEBUG |
X.Y.Z | WARN | WARN |
例 3(x.y沒指定,則使用直接祖先的級別)
Logger 名 | 分配的級別 | 起作用的級別 |
---|---|---|
root | DEBUG | DEBUG |
X | INFO | INFO |
X.Y | none | INFO |
X.Y.Z | ERROR | ERROR |
例 4(沒指定,則使用直接祖先的級別)
Logger name | 分配的級別 | 起作用的級別 |
---|---|---|
root | DEBUG | DEBUG |
X | INFO | INFO |
X.Y | none | INFO |
X.Y.Z | none | INFO |
上面說過說過日誌級別從低到高爲 TRACE < DEBUG < INFO < WARN < ERROR
.如果定義了高日誌級別,低日誌級不打印,不起作用。
Appender
它負責將日誌事件以合適的格式輸出到指定的地方:console控制檯,文件(.log,.html,.txt格式),mysql數據庫。定義輸出源必須要實現Appender 接口,核心抽象方法是doAppend(E event)。logback已經給我提供了實現的接口,我們直接使用就行了。
Encoders
編碼器負責將一個事件轉換爲一個字節數組,並將字節數組寫入輸出流中。
Layouts
佈局是用於將傳入事件轉換爲字符串的邏輯組件。
filter
對日誌級別過濾。下面介紹幾個常用的類:
ThreSholdFilter ,入門級過濾。對於小於該日誌級別的日誌就行過濾,如下配置,雖然指定日誌級別爲debug,但是>=info 級別的日誌,纔會被打印
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<root level="Debug">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<!--默認事件校驗使用的就是JaninoEventEvaluator,evaluator 可以不顯示指定JaninoEventEvaluator-->
<evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
<expression>
<!-- 該過濾表達式意思是,如果root 日誌級別大於debug,則輸入,如果不是,則輸入我們自己定義com.test包下的日誌。所依賴的三方jar包debug日誌不輸出。三方jar包產生的日誌是對我們調試是沒有幫助的,冗餘的,因此過濾掉-->
if(level > DEBUG){
return true;
}
return logger.contains("com.test");
</expression>
</evaluator>
<OnMismatch>DENY</OnMismatch>
<OnMatch>ACCEPT</OnMatch>
</filter>
注意,JaninoEventEvaluator依賴Janino jar包,因此,使用前,maven/gradle 要加入下面依賴:
compile 'org.codehaus.janino:janino:3.0.6'
配置文件
<?xml version="1.0" encoding="UTF-8"?>
#10秒監測一次配置文件,如果改動,則重新加載配置,這在測試和生產上都比較有用
<configuration scan="true" scanPeriod="10 seconds">
<!--<timestamp key="bySecond" datePattern="YYYY-MM-dd"/>-->
<!--logback提供了輸出到文件的輸出源,直接使用RollingFileAppender輸出源可對文件進行轉換(特定情況下,對日誌進行處理)。-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--實時日誌輸出路徑-->
<file>../logs/ctest.log</file>
<!--轉換日誌策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--轉換模式,日誌按天以test-2017-07-06.log形式存儲,最多存30天,30天之後自動刪除,所有日誌文件總大小不能超過10GB,如果超過則最老的文件會被刪除-->
<fileNamePattern>../logs/test-%d{YYYY-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<!--日誌是否立即輸出,設爲true則,立即輸出日誌,如果程序退出,日誌不會丟失,但是性能會比在false情況下慢四倍-->
<immediateFlush>false</immediateFlush>
<!--日誌輸入格式化,從左到右依次爲:
輸出時間;日誌級別;生成日誌事件的當前線程;對生成器包名進行簡化com.test.HomeController 會打印成c.t.HomeController;日誌請求的文件,及所在的行號,會影響性能,建議不要配置;打印日誌消息,換行
-->
<encoder>
<pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</encoder>
</appender>
<!--輸出到控制檯-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 和上面格式化一樣,唯一區別是對控制檯日誌內容加了顏色,-->
<encoder>
<pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
</encoder>
</appender>
<!--指定一個root 的日誌級別爲info,指定上面兩個輸出源繼承root日誌級別-->
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<!--指定對應包下的class日誌級別,和EvaluatorFilter作用相同-->
<logger name="com.test" level="WARN">
</configuration>
使用
logback使用很簡單,加入依賴,將logback.xml文件丟到項目裏即可。下面介紹springboot和springmvc的兩種框架下的使用方法。
springboot
017-07-06 19:43:06.574 [main] INFO o.a.tomcat.util.net.NioSelectorPool - Using a shared selector for servlet write/read
2017-07-06 19:43:06.591 [main] INFO o.s.b.c.e.t.TomcatEmbeddedServletContainer - Tomcat started on port(s): 82 (http)
2017-07-06 19:43:06.596 [main] INFO com.test.TestApplication - Started TestApplication in 14.101 seconds (JVM running for 14.721)
springmvc
gradle 或maven中加入以下依賴:
gradle
def logback.version = '1.2.3'
def slf4j.version = '1.7.21'
dependencies {
compile "ch.qos.logback:logback-core:${logback.version}"
compile "ch.qos.logback:logback-classic:${logback.version}"
compile "org.slf4j:slf4j-api:${slf4j.version}"
#使用filter才需引用這個jar
compile 'org.codehaus.janino:janino:3.0.6'
}
maven
<properties>
<logback.version>1.2.3</logback.version>
<slf4j.version>1.7.21</slf4j.version>
</properties>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.0.6</version>
</dependency>
</dependencies>