一、logback的介紹 Logback是由log4j創(chuàng)始人設(shè)計(jì)的另一個開源日志組件,官方網(wǎng)站: http://logback.qos.ch。它當(dāng)前分為下面下個模塊: logback-core:其它兩個模塊的基礎(chǔ)模塊 logback-classic:它是log4j的一個改良版本,同時它完整實(shí)現(xiàn)了slf4j API使你可以很方便地更換成其它日志系統(tǒng)如log4j或JDK14 Logging logback-access:訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能二、logback取代log4j的理由: 1、更快的實(shí)現(xiàn):Logback的內(nèi)核重寫了,在一些關(guān)鍵執(zhí)行路徑上性能提升10倍以上。而且logback不僅性能提升了,初始化內(nèi)存加載也更小了。 2、非常充分的測試:Logback經(jīng)過了幾年,數(shù)不清小時的測試。Logback的測試完全不同級別的。 3、Logback-classic非常自然實(shí)現(xiàn)了SLF4j:Logback-classic實(shí)現(xiàn)了SLF4j。在使用SLF4j中,你都感覺不到logback-classic。而且因?yàn)閘ogback-classic非常自然地實(shí)現(xiàn)了slf4j , 所 以切換到log4j或者其他,非常容易,只需要提供成另一個jar包就OK,根本不需要去動那些通過SLF4JAPI實(shí)現(xiàn)的代碼。 4、非常充分的文檔 官方網(wǎng)站有兩百多頁的文檔。 5、自動重新加載配置文件,當(dāng)配置文件修改了,Logback-classic能自動重新加載配置文件。掃描過程快且安全,它并不需要另外創(chuàng)建一個掃描線程。這個技術(shù)充分保證了應(yīng)用程序能跑得很歡在JEE環(huán)境里面。 6、Lilith是log事件的觀察者,和log4j的chainsaw類似。而lilith還能處理大數(shù)量的log數(shù)據(jù) 。 7、謹(jǐn)慎的模式和非常友好的恢復(fù),在謹(jǐn)慎模式下,多個FileAppender實(shí)例跑在多個JVM下,能 夠安全地寫道同一個日志文件。RollingFileAppender會有些限制。Logback的FileAppender和它的子類包括 RollingFileAppender能夠非常友好地從I/O異常中恢復(fù)。 8、配置文件可以處理不同的情況,開發(fā)人員經(jīng)常需要判斷不同的Logback配置文件在不同的環(huán)境下(開發(fā),測試,生產(chǎn))。而這些配置文件僅僅只有一些很小的不同,可以通過,和來實(shí)現(xiàn),這樣一個配置文件就可以適應(yīng)多個環(huán)境。 9、Filters(過濾器)有些時候,需要診斷一個問題,需要打出日志。在log4j,只有降低日志級別,不過這樣會打出大量的日志,會影響應(yīng)用性能。在Logback,你可以繼續(xù) 保持那個日志級別而除掉某種特殊情況,如alice這個用戶登錄,她的日志將打在DEBUG級別而其他用戶可以繼續(xù)打在WARN級別。要實(shí)現(xiàn)這個功能只需加4行xml配置。可以參考MDCFIlter 。 10、SiftingAppender(一個非常多功能的Appender):它可以用來分割日志文件根據(jù)任何一個給定的運(yùn)行參數(shù)。如,SiftingAppender能夠區(qū)別日志事件跟進(jìn)用戶的session,然后每個用戶會有一個日志文件。 11、自動壓縮已經(jīng)打出來的log:RollingFileAppender在產(chǎn)生新文件的時候,會自動壓縮已經(jīng)打出來的日志文件。壓縮是個異步過程,所以甚至對于大的日志文件,在壓縮過程中應(yīng)用不會受任何影響。 12、堆棧樹帶有包版本:Logback在打出堆棧樹日志時,會帶上包的數(shù)據(jù)。 13、自動去除舊的日志文件:通過設(shè)置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory屬性,你可以控制已經(jīng)產(chǎn)生日志文件的最大數(shù)量。如果設(shè)置maxHistory 12,那那些log文件超過12個月的都會被自動移除。
<!-- Logging with SLF4J & LogBack --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> <scope>runtime</scope> </dependency>技術(shù)介紹devtools:是boot的一個熱部署工具,當(dāng)我們修改了classpath下的文件(包括類文件、屬性文件、頁面等)時,會重新啟動應(yīng)用(由于其采用的雙類加載器機(jī)制,這個啟動會非常快,如果發(fā)現(xiàn)這個啟動比較慢,可以選擇使用jrebel)雙類加載器機(jī)制:boot使用了兩個類加載器來實(shí)現(xiàn)重啟(restart)機(jī)制:base類加載器(簡稱bc)+restart類加載器(簡稱rc)。 bc:用于加載不會改變的jar(eg.第三方依賴的jar)rc:用于加載我們正在開發(fā)的jar(eg.整個項(xiàng)目里我們自己編寫的類)。當(dāng)應(yīng)用重啟后,原先的rc被丟掉、重新new一個rc來加載這些修改過的東西,而bc卻不需要動一下。這就是devtools重啟速度快的原因。thymeleaf:boot推薦的模板引擎,這里做簡要的介紹,用來介紹devtools對頁面的熱部署。 <!-- thymeleaf --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- devtools可以實(shí)現(xiàn)頁面熱部署(即頁面修改后會立即生效,這個可以直接在application.properties文件中配置spring.thymeleaf.cache=false來實(shí)現(xiàn)), 實(shí)現(xiàn)類文件熱部署(類文件修改后不會立即生效),實(shí)現(xiàn)對屬性文件的熱部署。 即devtools會監(jiān)聽classpath下的文件變動,并且會立即重啟應(yīng)用(發(fā)生在保存時機(jī)),注意:因?yàn)槠洳捎玫奶摂M機(jī)機(jī)制,該項(xiàng)重啟是很快的 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional><!-- optional=true,依賴不會傳遞,該項(xiàng)目依賴devtools;之后依賴myboot項(xiàng)目的項(xiàng)目如果想要使用devtools,需要重新引入 --> </dependency>說明:如果僅僅使用thymeleaf,只需要引入thymeleaf;如果需要使用devtools,只需要引入devtools。注意: maven中的optional=true表示依賴不會傳遞。即此處引用的devtools不會傳遞到依賴myboot項(xiàng)目的項(xiàng)目中。 僅僅加入devtools在我們的eclipse中還不起作用,這時候還需要對之前添加的spring-boot-maven-plugin做一些修改,如下:
<!-- 用于將應(yīng)用打成可直接運(yùn)行的jar(該jar就是用于生產(chǎn)環(huán)境中的jar) 值得注意的是,如果沒有引用spring-boot-starter-parent做parent, 且采用了上述的第二種方式,這里也要做出相應(yīng)的改動 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork><!-- 如果沒有該項(xiàng)配置,肯呢個devtools不會起作用,即應(yīng)用不會restart --> </configuration> </plugin>測試:修改類-->保存:應(yīng)用會重啟修改配置文件-->保存:應(yīng)用會重啟修改頁面-->保存:應(yīng)用不會重啟,但會重新加載,頁面會刷新(原理是將spring.thymeleaf.cache設(shè)為false)補(bǔ)充:默認(rèn)情況下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public這些文件夾下的文件修改不會使應(yīng)用重啟,但是會重新加載(devtools內(nèi)嵌了一個LiveReload server,當(dāng)資源發(fā)生改變時,瀏覽器刷新)。如果想改變默認(rèn)的設(shè)置,可以自己設(shè)置不重啟的目錄:spring.devtools.restart.exclude=static/**,public/**,這樣的話,就只有這兩個目錄下的文件修改不會導(dǎo)致restart操作了。如果要在保留默認(rèn)設(shè)置的基礎(chǔ)上還要添加其他的排除目錄:spring.devtools.restart.additional-exclude如果想要使得當(dāng)非classpath下的文件發(fā)生變化時應(yīng)用得以重啟,使用:spring.devtools.restart.additional-paths,這樣devtools就會將該目錄列入了監(jiān)聽范圍。排除靜態(tài)資源文件靜態(tài)資源文件在改變之后有時候沒必要觸發(fā)應(yīng)用程序重啟,例如,Thymeleaf的模板會被變量替代。默認(rèn)的,/META-INF/maven、/META-INF/resources、/resources、/static、/public或者/templates這些目錄下的文件修改之后不會觸發(fā)重啟但是會觸發(fā)LiveReload。
可以使用spring.devtools.restart.exclude屬性配置,例如 spring.devtools.restart.exclude=static/**,public/** ※ 如果想保留默認(rèn)配置,同時增加新的配置,則可使用spring.devtools.restart.additional-exclude屬性

=========
新聞熱點(diǎn)
疑難解答