31logger組件tomcat日志框架及實(shí)戰(zhàn)_第1頁
31logger組件tomcat日志框架及實(shí)戰(zhàn)_第2頁
31logger組件tomcat日志框架及實(shí)戰(zhàn)_第3頁
31logger組件tomcat日志框架及實(shí)戰(zhàn)_第4頁
31logger組件tomcat日志框架及實(shí)戰(zhàn)_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

下載下載 31|Logger組件:Tomcat2019-07-20深入拆解Tomcat& 進(jìn)入課07:29每一個(gè)系統(tǒng)都有一些通用的模塊,比如日志模塊、異常處理模塊、工具類等,對(duì)于Tomcat來說,比較重要的通用模塊有日志、Session管理和集群管理。從今天開始我會(huì)分三期來介日志模塊作為一個(gè)通用的功能,在系統(tǒng)里通常會(huì)使用第三方的日志框架。Java的日志框架有很多,比如:JUL(JavaUtilLogging)、Log4j、Logback、Log4j2、Tinylog此之外,還有JCL(ApacheCommonsLogging)和SLF4J這樣的“門面日志”。下面是SLF4J與日志框架Logback、Log4j的關(guān)系圖:07:29下載 31|Logger組件:Tomcat2019-07-20李號(hào)雙深入拆解Tomcat& 進(jìn)入課每一個(gè)系統(tǒng)都有一些通用的模塊,比如日志模塊、異常處理模塊、工具類等,對(duì)于Tomcat來說,比較重要的通用模塊有日志、Session管理和集群管理。從今天開始我會(huì)分三期來介日志模塊作為一個(gè)通用的功能,在系統(tǒng)里通常會(huì)使用第三方的日志框架。Java的日志框架有很多,比如:JUL(JavaUtilLogging)、Log4j、Logback、Log4j2、Tinylog等。除此之外,還有JCL(ApacheCommonsLogging)和SLF4J這樣的“門面日志”。下面是SLF4J與日志框架Logback、Log4j的關(guān)系圖:我先來解釋一下什么是“門面日志”?!伴T面日志”利用了設(shè)計(jì)模式中的門面模式思想,對(duì)外提供一套通用的日志記錄的API,而不提供具體的日志輸出服務(wù),如果要實(shí)現(xiàn)日志輸出,需要集成其他的日志框架,比如Log4j、Logback、Log4j2等。這種門面模式的好處在于,記錄日志的API和日志輸出的服務(wù)分離開,代碼里面只需要關(guān)注記錄日志的API,通過SLF4J指定的接口記錄日志;而日志輸出通過引入JAR包的方式改變引入日志輸出框架JAR包。今天我們就來看看Tomcat的日志模塊是如何實(shí)現(xiàn)的。默認(rèn)情況下,Tomcat使用自身的JULI作為Tomcat內(nèi)部的日志處理系統(tǒng)。JULI的日志門面采用了JCL;而JULI的具體實(shí)現(xiàn)是構(gòu)建在Java原生的日志系統(tǒng)java.util.logging之上的,所以在看JULI的日志系統(tǒng)之前,我先簡單介紹一下Java的日志系統(tǒng)。JavaJavajava.util.logging路徑下,包含了幾個(gè)比較重要的組件,我們通過一外提供一套通用的日志記錄的API,而不提供具體的日志輸出服務(wù),如果要實(shí)現(xiàn)日志輸出,需要集成其他的日志框架,比如Log4j、Logback、Log4j2等。這種門面模式的好處在于,記錄日志的API和日志輸出的服務(wù)分離開,代碼里面只需要關(guān)注記錄日志的API,通過SLF4J指定的接口記錄日志;而日志輸出通過引入JAR包的方式改變引入日志輸出框架JAR包。今天我們就來看看Tomcat的日志模塊是如何實(shí)現(xiàn)的。默認(rèn)情況下,Tomcat使用自身的JULI作為Tomcat內(nèi)部的日志處理系統(tǒng)。JULI的日志門面采用了JCL;而JULI的具體實(shí)現(xiàn)是構(gòu)建在Java原生的日志系統(tǒng)java.util.logging之上的,所以在看JULI的日志系統(tǒng)之前,我先簡單介紹一下Java的日志系統(tǒng)。JavaJava的日志包在java.util.logging路徑下,包含了幾個(gè)比較重要的組件,我們通過一 規(guī)定了日志的輸出方式,如控制臺(tái)輸出、寫入文件。Level:定 復(fù)制代碼publicstaticvoidmain(String[]args)Loggerlogger=Handlerhd=new("start9復(fù)制代碼publicstaticvoidmain(String[]args)Loggerlogger=Handlerhd=new("start9JULI對(duì)日志的處理方式與Java自帶的基本一致,但是Tomcat中可以包含多個(gè)應(yīng)用,而每個(gè)應(yīng)用的日志系統(tǒng)應(yīng)該相互獨(dú)立。Java的原生日志系統(tǒng)是每個(gè)JVM有一份日志的配置文件,這不符合Tomcat多應(yīng)用的場景,所以JULI重新實(shí)現(xiàn)了一些日志接口。Log的基礎(chǔ)實(shí)現(xiàn)類是DirectJDKLog,這個(gè)類相對(duì)簡單,就包裝了一下Java的LoggerLog使用了工廠模式來向外提供實(shí)例,LogFactory是一個(gè)單例,可以通過SeviceLoader為Log提供自定義的實(shí)現(xiàn)版本,如果沒有配置,就默認(rèn)使用DirectJDKLog。復(fù)制代碼privateLogFactory()2//通過ServiceLoader嘗試加載Log3ServiceLoader<Log>logLoader=4Constructor<?extendsLog>56for(Loglog:logLoader)7Class<?extendsLog>8try9}catch(NoSuchMethodException|SecurityExceptione)thrownew}}//如何沒有定義Log的實(shí)現(xiàn)類,discoveredLogConstructor為discoveredLogConstructor=}下面的代碼是LogFactory的getInstance方法:復(fù)制代碼publicLoggetInstance(Stringname)throwsLogConfigurationException//如果discoveredLogConstructor為null,也就沒有定義Log類,默認(rèn)用JULIJavaTomcat個(gè)應(yīng)用的日志系統(tǒng)應(yīng)該相互獨(dú)立。Java的原生日志系統(tǒng)是每個(gè)JVM有一份日志的配置文件,這不符合Tomcat多應(yīng)用的場景,所以JULI重新實(shí)現(xiàn)了一些日志接口。LogDirectJDKLog,Java復(fù)制代碼privateLogFactory()//通過ServiceLoader嘗試加載LogServiceLoader<Log>logLoader=Constructor<?extendsLog>5for(Loglog:logLoader)Class<?extendsLog>try catch(NoSuchMethodException|SecurityExceptione)thrownew //如何沒有定義Log的實(shí)現(xiàn)類,discoveredLogConstructor為discoveredLogConstructor=19下面的代碼是LogFactory的getInstance復(fù)制代碼1publicLoggetInstance(Stringname)throwsLogConfigurationException3if(discoveredLogConstructor==null)4return5}67try8return9}catch(ReflectiveOperationException|IllegalArgumentExceptione)thrownew}}在JULI中就自定義了兩個(gè)Handler:FileHandler和AsyncFileHandler。FileHandler可以簡單地理解為一個(gè)在特定位置寫文件的工具類,有一些寫操作常用的方法,如open、write(publish)、close、flush等,使用了讀寫鎖。其中的日志信息通過Formatter來格式AsyncFileHandler繼承自FileHandler,實(shí)現(xiàn)了異步的寫操作。其中緩存存儲(chǔ)是通過阻塞雙端隊(duì)列LinkedBlockingDeque來實(shí)現(xiàn)的。當(dāng)應(yīng)用要通過這個(gè)Handler來記錄一條消息消息會(huì)通過父類的publish方法寫入相應(yīng)文件內(nèi)。這樣就可以在大量日志需要寫入的時(shí)候棄一些日志:復(fù)制代碼1OVERFLOW_DROP_LAST2OVERFLOW_DROP_FIRSH3OVERFLOW_DROP_FLUSH4OVERFLOW_DROP_CURRENTFormatter通過一個(gè)format方法將日志記錄LogRecord轉(zhuǎn)化成格式化的字符串,JULI提供了三個(gè)新的Formatter。 //如果discoveredLogConstructor為null,也就沒有定義Log類,默認(rèn)用OnlineFormatter:基本與Java自帶的SimpleFormatter格式相同,不過把所有內(nèi)容Tomcat的日志配置文件為Tomcat文件夾下conf/perties。我來拆解一下這個(gè)配置文件,首先可以看到各種Handler的配置:復(fù)制代碼1handlers=1.apache.juli.AsyncFileHandler,23.handlers=1.apache.juli.AsyncFileHandler,以1.apache.juli.AsyncFileHandle為例,數(shù)字是為了區(qū)分同一個(gè)類的不同實(shí)例;catalina、localhost、manager和host-manager是Tomcat用來區(qū)分不同系統(tǒng)日志的標(biāo)志;后面的字符串表示了Handler具體類型,如果要添加Tomcat器的自定義Handler,需要在字符串里添加。接下來是每個(gè)Handler設(shè)置日志等級(jí)、目錄和文件前綴,自定義的Handler也要在這里配復(fù)制代碼1.apache.juli.AsyncFileHandler.level=1.apache.juli.AsyncFileHandler.directory=1.apache.juli.AsyncFileHandler.prefix=1.apache.juli.AsyncFileHandler.maxDays=1.apache.juli.AsyncFileHandler.encoding=UTF-Tomcat+SLF4J+在今天文章開頭我提到,SLF4J和JCL都是日志門面,那它們有什么區(qū)別呢?它們的區(qū)別主要體現(xiàn)在日志服務(wù)類的綁定機(jī)制上。JCL采用運(yùn)行時(shí)動(dòng)態(tài)綁定的機(jī)制,在運(yùn)行時(shí)動(dòng)態(tài)尋找if(discoveredLogConstructor==null)return 6tryreturn}catch(ReflectiveOperationException|IllegalArgumentExceptione)thrownew 12在JULI中就自定義了兩個(gè)Handler:FileHandler和AsyncFileHandler。FileHandler可以簡單地理解為一個(gè)在特定位置寫文件的工具類,有一些寫操作常用的方法,如open、write(publish)、close、flush等,使用了讀寫鎖。其中的日志信息通過Formatter來格式AsyncFileHandler繼承自FileHandler,實(shí)現(xiàn)了異步的寫操作。其中緩存存儲(chǔ)是通過阻塞雙端隊(duì)列LinkedBlockingDeque來實(shí)現(xiàn)的。當(dāng)應(yīng)用要通過這個(gè)Handler來記錄一條消息消息會(huì)通過父類的publish方法寫入相應(yīng)文件內(nèi)。這樣就可以在大量日志需要寫入的時(shí)候復(fù)制代碼FormatterformatLogRecord,JULI供了三個(gè)新的Formatter。SLF4J日志輸出服務(wù)綁定則相對(duì)簡單很多,在編譯時(shí)就靜態(tài)綁定日志框架,只需要提前引入需要的日志框架。另外Logback可以說Log4j的進(jìn)化版,在性能和可用性方面都有所提升。你可以參考官網(wǎng)上這篇文章來了解Logback的優(yōu)勢。基于此我們來實(shí)戰(zhàn)一下如何將Tomcat默認(rèn)的日志框架切換成為“SLF4J+Logback”。根據(jù)你的Tomcat版本,從這里下載所需要文件。解壓后你會(huì)看到一個(gè)類似于Tomcat替換或拷貝下列這些文件到Tomcat的安裝目錄:刪除啟動(dòng)今天我們談了日志框架與日志門面的區(qū)別,以及Tomcat的日志模塊是如何實(shí)現(xiàn)的。默認(rèn)情況下,Tomcat的日志模板叫作JULI,JULI的日志門面采用了JCL,而具體實(shí)現(xiàn)是基于Java默認(rèn)的日志框架JavaUtilLogging,Tomcat在JavaUtilLogging基礎(chǔ)上進(jìn)行了改造,使得它自身的日志框架不會(huì)影響Web式。最后我分享了如何將Tomcat的日志模塊切換到時(shí)下流行的“SLF4J+Logback”,希望對(duì)你有所幫助。OnlineFormatterJavaSimpleFormatterTomcatTomcatconf/perties。我來拆解一下這個(gè)配置文件,首先可以看到各種Handler的配置:復(fù)制代碼1handlers=1.apache.juli.AsyncFileHandler,23.handlers=1.apache.juli.AsyncFileHandler,以1.apache.juli.AsyncFileHandler為例,數(shù)字是為了區(qū)分同一個(gè)類的不同實(shí)例;catalina、localhost、manager和host-manager是Tomcat用來區(qū)分不同系統(tǒng)日志的標(biāo)志;后面的字符串表示了Handler具體類型,如果要添加Tomcat服務(wù)器的自定義Handler,需要在字符串里添加。接下來是每個(gè)Handler設(shè)置日志等級(jí)、目錄和文件前綴,自定義的Handler也要在這里配復(fù)制代碼1.apache.juli.AsyncFileHandler.level=1.apache.juli.AsyncFileHandler.directory=1.apache.juli.AsyncFileHandler.prefix=1.apache.juli.AsyncFileHandler.maxDays=1.apache.juli.AsyncFileHandler.encoding=UTF-Tomcat+SLF4J+在今天文章開頭我提到,SLF4J和JCLTomcat獨(dú)立部署時(shí),各種日志都輸出到了相應(yīng)的日志文件,假如SpringBoot以內(nèi)嵌式的方式運(yùn)行Tomcat,這種情況下To

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論