Logback是一個開源的日誌組件,是log4j的做者開發的用來替代log4j的。html
logback由三個部分組成,logback-core, logback-classic, logback-access。其中logback-core是其餘兩個模塊的基礎。java
slf4j 定義日誌接口及基本實現,而具體的實現由其餘日誌組件提供git
所以,若是想替換成其餘的日誌組件,只須要替換jar包便可。github
Logger: 日誌記錄器,把它關聯到應用對應的context上後,主要用於存放日誌對象,定義日誌類型,級別。web
Appender: 指定日誌輸出的目的地,目的地能夠是控制檯,文件,或者數據庫等數據庫
Layout: 負責把事件轉換成字符串,格式化日誌信息的輸出安全
一、更快的實現 Logback的內核重寫了,在一些關鍵執行路徑上性能提高10倍以上。並且logback不只性能提高了,初始化內存加載也更小了。eclipse
二、很是充分的測試 Logback通過了幾年,數不清小時的測試。Logback的測試徹底不一樣級別的。在做者的觀點,這是簡單重要的緣由選擇logback而不是log4j。異步
三、Logback-classic很是天然實現了SLF4j Logback-classic實現了 SLF4j。在使用SLF4j中,你都感受不到logback-classic。並且由於logback-classic很是天然地實現了SLF4J, 所 以切換到log4j或者其餘,很是容易,只須要提供成另外一個jar包就OK,根本不須要去動那些經過SLF4JAPI實現的代碼。
四、很是充分的文檔 官方網站有兩百多頁的文檔。
五、自動從新加載配置文件 當配置文件修改了,Logback-classic能自動從新加載配置文件。掃描過程快且安全,它並不須要另外建立一個掃描線程。這個技術充分保證了應用程序能跑得很歡在JEE環境裏面。
六、Lilith Lilith是log事件的觀察者,和log4j的chainsaw相似。而lilith還能處理大數量的log數據 。
七、謹慎的模式和很是友好的恢復 在謹慎模式下,多個FileAppender實例跑在多個JVM下,能 夠安全地寫道同一個日誌文件。RollingFileAppender會有些限制。Logback的FileAppender和它的子類包括 RollingFileAppender可以很是友好地從I/O異常中恢復。
八、配置文件能夠處理不一樣的狀況 開發人員常常須要判斷不一樣的Logback配置文件在不一樣的環境下(開發,測試,生產)。而這些配置文件僅僅只有一些很小的不一樣,能夠經過,和來實現,這樣一個配置文件就能夠適應多個環境。
九、Filters(過濾器) 有些時候,須要診斷一個問題,須要打出日誌。在log4j,只有下降日誌級別,不過這樣會打出大量的日誌,會影響應用性能。在Logback,你能夠繼續 保持那個日誌級別而除掉某種特殊狀況,如alice這個用戶登陸,她的日誌將打在DEBUG級別而其餘用戶能夠繼續打在WARN級別。要實現這個功能只需 加4行XML配置。能夠參考MDCFIlter 。
十、SiftingAppender(一個很是多功能的Appender) 它能夠用來分割日誌文件根據任何一個給定的運行參數。如,SiftingAppender可以區別日誌事件跟進用戶的Session,而後每一個用戶會有一個日誌文件。
十一、自動壓縮已經打出來的log RollingFileAppender在產生新文件的時候,會自動壓縮已經打出來的日誌文件。壓縮是個異步過程,因此甚至對於大的日誌文件,在壓縮過程當中應用不會受任何影響。
十二、堆棧樹帶有包版本 Logback在打出堆棧樹日誌時,會帶上包的數據。
1三、自動去除舊的日誌文件 經過設置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory屬性,你能夠控制已經產生日誌文件的最大數量。若是設置maxHistory 12,那那些log文件超過12個月的都會被自動移除。
總之,logback比log4j太優秀了,讓咱們的應用所有創建logback上吧 !
這個logback的實例會這樣展開:
其中Test.java
package com.piedra.logback;
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Test { private final static Logger logger = LoggerFactory.getLogger(Test.class); public static void main(String[] args) { logger.info("logback {}","INFO ( TRACE < DEBUG < INFO < WARN < ERROR )"); logger.error("logback {}","ERROR ( TRACE < DEBUG < INFO < WARN < ERROR )"); } }
logback.xml:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <contextName>Logback Demo</contextName> <property name="LOG_HOME" value="logs" /> <!-- 控制檯輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoder默認配置爲PartternLayoutEncoder --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${LOG_HOME}/myLog.log</file> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!-- 按照天天生成日誌文件 --> <appender name="ROLLINGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日誌文件輸出的文件名--> <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.log</FileNamePattern> <!--日誌文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日誌文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" additivity="false" /> <logger name="com.piedra.logback" level="WARN"> <appender-ref ref="FILE"/> </logger> <root level="ERROR"> <appender-ref ref="STDOUT" /> <appender-ref ref="ROLLINGFILE" /> </root> </configuration>
build.gradle
apply plugin:"java" apply plugin:"eclipse" repositories{ mavenCentral() } dependencies{ compile "ch.qos.logback:logback-classic:1.1.2" }
至此,已經將項目的源碼和目錄結構都截圖說明了,接下來根據Test.java來對logback.xml文件進行解釋說明。
configuration: 爲logback.xml配置文件的根節點,具備屬性 scan,scanPeriod,debug scan: 當此屬性設置爲true時,配置文件若是發生改變,將會被從新加載,默認值爲true。 scanPeriod: 設置監測配置文件是否有修改的時間間隔,若是沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。 debug: 當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false
contextName 表示工程的名稱,惟一值
property 節點用來定義變量值,具備兩個屬性,name和value,後續的配置中能夠經過 ${var} 來引用在property中定義的變量
appender 是的子節點,負責寫日誌的組件,具有以下屬性:
name: appender的名稱 class: appender全限定名
具體的Appender分類
ConsoleAppender 子節點:
encoder: 對日誌進行格式化 target: System.out 或者 System.err默認爲System.out
FileAppender 將日誌文件寫到文件中
file: 被寫入的文件名,相對目錄或者絕對目錄,若是上級目錄不存在會自動建立,無默認值 append: 若是爲true,末尾追加。 若是爲false,清空現有文件 encoder: 格式化 prudent: 若是爲true,日誌會被安全的寫入文件,效率低 默認爲false
RollingFileAppender 滾動記錄文件,先將日誌記錄到指定的文件,當符合某個調價你的時候,將日誌記錄到其餘文件。有如下子節點:
file: 被寫入的文件名 append: true表示追加 默認爲true encoder: 格式化 rollingPolicy: triggeringPolicy prudent:
logger 用來設置某一個包或者某一個類的日誌打印級別,以及指定
name: 用來指定受此logger約束的某一個包或者某一個類
level: 用來設定打印機別. TRACE < DEBUG < INFO < WARN < ERROR addtivity: 默認爲true,將此loger的打印信息向上級傳遞; <logger>能夠包含0到多個 <appender-ref>
對於
<logger name="com.piedra.logback" level="WARN"> <appender-ref ref="FILE"/> </logger>
這個logger來講,指定了com.piedra.logback這個包的日誌級別爲WARN,appender-ref爲FILE,而且addtivity默認爲true,表示向上級傳遞。因此,當Test類記錄日誌的時候,調用error方法的日誌會被輸出到FILE的Appender中,而且向上傳遞到root logger。由於root logger爲ERROR的日誌級別,因此,也會將信息輸出到STDOUT和ROLLINGFILE這兩個Appender中。
root 也是元素,可是它是根logger。只有一個level屬性。由於已經被命名爲爲root
參數參考<logger>元素的相關說明
若是日誌模塊單獨出一個項目,好比上面的例子,單獨出一個logback模塊,那麼另一個項目A引用這個模塊,若是說項目A沒有任何logback.xml 或者 logback-test.xml配置文件的話,就會採用引入的子模塊logback中的配置文件來輸出日誌信息。
若是項目A中定義了本身的logback.xml配置文件,那麼就使用項目A本身的配置。
轉載請註明出處! 原文地址: http://webinglin.github.io