




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
下載下載 31|Logger組件:Tomcat2019-07-20深入拆解Tomcat& 進(jìn)入課07:29每一個(gè)系統(tǒng)都有一些通用的模塊,比如日志模塊、異常處理模塊、工具類等,對(duì)于Tomcat來(lái)說(shuō),比較重要的通用模塊有日志、Session管理和集群管理。從今天開(kāi)始我會(huì)分三期來(lái)介日志模塊作為一個(gè)通用的功能,在系統(tǒng)里通常會(huì)使用第三方的日志框架。Java的日志框架有很多,比如:JUL(JavaUtilLogging)、Log4j、Logback、Log4j2、Tinylog此之外,還有JCL(ApacheCommonsLogging)和SLF4J這樣的“門(mén)面日志”。下面是SLF4J與日志框架Logback、Log4j的關(guān)系圖:07:29下載 31|Logger組件:Tomcat2019-07-20李號(hào)雙深入拆解Tomcat& 進(jìn)入課每一個(gè)系統(tǒng)都有一些通用的模塊,比如日志模塊、異常處理模塊、工具類等,對(duì)于Tomcat來(lái)說(shuō),比較重要的通用模塊有日志、Session管理和集群管理。從今天開(kāi)始我會(huì)分三期來(lái)介日志模塊作為一個(gè)通用的功能,在系統(tǒng)里通常會(huì)使用第三方的日志框架。Java的日志框架有很多,比如:JUL(JavaUtilLogging)、Log4j、Logback、Log4j2、Tinylog等。除此之外,還有JCL(ApacheCommonsLogging)和SLF4J這樣的“門(mén)面日志”。下面是SLF4J與日志框架Logback、Log4j的關(guān)系圖:我先來(lái)解釋一下什么是“門(mén)面日志”?!伴T(mén)面日志”利用了設(shè)計(jì)模式中的門(mén)面模式思想,對(duì)外提供一套通用的日志記錄的API,而不提供具體的日志輸出服務(wù),如果要實(shí)現(xiàn)日志輸出,需要集成其他的日志框架,比如Log4j、Logback、Log4j2等。這種門(mén)面模式的好處在于,記錄日志的API和日志輸出的服務(wù)分離開(kāi),代碼里面只需要關(guān)注記錄日志的API,通過(guò)SLF4J指定的接口記錄日志;而日志輸出通過(guò)引入JAR包的方式改變引入日志輸出框架JAR包。今天我們就來(lái)看看Tomcat的日志模塊是如何實(shí)現(xiàn)的。默認(rèn)情況下,Tomcat使用自身的JULI作為T(mén)omcat內(nèi)部的日志處理系統(tǒng)。JULI的日志門(mén)面采用了JCL;而JULI的具體實(shí)現(xiàn)是構(gòu)建在Java原生的日志系統(tǒng)java.util.logging之上的,所以在看JULI的日志系統(tǒng)之前,我先簡(jiǎn)單介紹一下Java的日志系統(tǒng)。JavaJavajava.util.logging路徑下,包含了幾個(gè)比較重要的組件,我們通過(guò)一外提供一套通用的日志記錄的API,而不提供具體的日志輸出服務(wù),如果要實(shí)現(xiàn)日志輸出,需要集成其他的日志框架,比如Log4j、Logback、Log4j2等。這種門(mén)面模式的好處在于,記錄日志的API和日志輸出的服務(wù)分離開(kāi),代碼里面只需要關(guān)注記錄日志的API,通過(guò)SLF4J指定的接口記錄日志;而日志輸出通過(guò)引入JAR包的方式改變引入日志輸出框架JAR包。今天我們就來(lái)看看Tomcat的日志模塊是如何實(shí)現(xiàn)的。默認(rèn)情況下,Tomcat使用自身的JULI作為T(mén)omcat內(nèi)部的日志處理系統(tǒng)。JULI的日志門(mén)面采用了JCL;而JULI的具體實(shí)現(xiàn)是構(gòu)建在Java原生的日志系統(tǒng)java.util.logging之上的,所以在看JULI的日志系統(tǒng)之前,我先簡(jiǎn)單介紹一下Java的日志系統(tǒng)。JavaJava的日志包在java.util.logging路徑下,包含了幾個(gè)比較重要的組件,我們通過(guò)一 規(guī)定了日志的輸出方式,如控制臺(tái)輸出、寫(xiě)入文件。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)用的場(chǎng)景,所以JULI重新實(shí)現(xiàn)了一些日志接口。Log的基礎(chǔ)實(shí)現(xiàn)類是DirectJDKLog,這個(gè)類相對(duì)簡(jiǎn)單,就包裝了一下Java的LoggerLog使用了工廠模式來(lái)向外提供實(shí)例,LogFactory是一個(gè)單例,可以通過(guò)SeviceLoader為L(zhǎng)og提供自定義的實(shí)現(xiàn)版本,如果沒(méi)有配置,就默認(rèn)使用DirectJDKLog。復(fù)制代碼privateLogFactory()2//通過(guò)ServiceLoader嘗試加載Log3ServiceLoader<Log>logLoader=4Constructor<?extendsLog>56for(Loglog:logLoader)7Class<?extendsLog>8try9}catch(NoSuchMethodException|SecurityExceptione)thrownew}}//如何沒(méi)有定義Log的實(shí)現(xiàn)類,discoveredLogConstructor為discoveredLogConstructor=}下面的代碼是LogFactory的getInstance方法:復(fù)制代碼publicLoggetInstance(Stringname)throwsLogConfigurationException//如果discoveredLogConstructor為null,也就沒(méi)有定義Log類,默認(rèn)用JULIJavaTomcat個(gè)應(yīng)用的日志系統(tǒng)應(yīng)該相互獨(dú)立。Java的原生日志系統(tǒng)是每個(gè)JVM有一份日志的配置文件,這不符合Tomcat多應(yīng)用的場(chǎng)景,所以JULI重新實(shí)現(xiàn)了一些日志接口。LogDirectJDKLog,Java復(fù)制代碼privateLogFactory()//通過(guò)ServiceLoader嘗試加載LogServiceLoader<Log>logLoader=Constructor<?extendsLog>5for(Loglog:logLoader)Class<?extendsLog>try catch(NoSuchMethodException|SecurityExceptione)thrownew //如何沒(méi)有定義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可以簡(jiǎn)單地理解為一個(gè)在特定位置寫(xiě)文件的工具類,有一些寫(xiě)操作常用的方法,如open、write(publish)、close、flush等,使用了讀寫(xiě)鎖。其中的日志信息通過(guò)Formatter來(lái)格式AsyncFileHandler繼承自FileHandler,實(shí)現(xiàn)了異步的寫(xiě)操作。其中緩存存儲(chǔ)是通過(guò)阻塞雙端隊(duì)列LinkedBlockingDeque來(lái)實(shí)現(xiàn)的。當(dāng)應(yīng)用要通過(guò)這個(gè)Handler來(lái)記錄一條消息消息會(huì)通過(guò)父類的publish方法寫(xiě)入相應(yīng)文件內(nèi)。這樣就可以在大量日志需要寫(xiě)入的時(shí)候棄一些日志:復(fù)制代碼1OVERFLOW_DROP_LAST2OVERFLOW_DROP_FIRSH3OVERFLOW_DROP_FLUSH4OVERFLOW_DROP_CURRENTFormatter通過(guò)一個(gè)format方法將日志記錄LogRecord轉(zhuǎn)化成格式化的字符串,JULI提供了三個(gè)新的Formatter。 //如果discoveredLogConstructor為null,也就沒(méi)有定義Log類,默認(rèn)用OnlineFormatter:基本與Java自帶的SimpleFormatter格式相同,不過(guò)把所有內(nèi)容Tomcat的日志配置文件為T(mén)omcat文件夾下conf/perties。我來(lái)拆解一下這個(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用來(lái)區(qū)分不同系統(tǒng)日志的標(biāo)志;后面的字符串表示了Handler具體類型,如果要添加Tomcat器的自定義Handler,需要在字符串里添加。接下來(lái)是每個(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+在今天文章開(kāi)頭我提到,SLF4J和JCL都是日志門(mén)面,那它們有什么區(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可以簡(jiǎn)單地理解為一個(gè)在特定位置寫(xiě)文件的工具類,有一些寫(xiě)操作常用的方法,如open、write(publish)、close、flush等,使用了讀寫(xiě)鎖。其中的日志信息通過(guò)Formatter來(lái)格式AsyncFileHandler繼承自FileHandler,實(shí)現(xiàn)了異步的寫(xiě)操作。其中緩存存儲(chǔ)是通過(guò)阻塞雙端隊(duì)列LinkedBlockingDeque來(lái)實(shí)現(xiàn)的。當(dāng)應(yīng)用要通過(guò)這個(gè)Handler來(lái)記錄一條消息消息會(huì)通過(guò)父類的publish方法寫(xiě)入相應(yīng)文件內(nèi)。這樣就可以在大量日志需要寫(xiě)入的時(shí)候復(fù)制代碼FormatterformatLogRecord,JULI供了三個(gè)新的Formatter。SLF4J日志輸出服務(wù)綁定則相對(duì)簡(jiǎn)單很多,在編譯時(shí)就靜態(tài)綁定日志框架,只需要提前引入需要的日志框架。另外Logback可以說(shuō)Log4j的進(jìn)化版,在性能和可用性方面都有所提升。你可以參考官網(wǎng)上這篇文章來(lái)了解Logback的優(yōu)勢(shì)。基于此我們來(lái)實(shí)戰(zhàn)一下如何將Tomcat默認(rèn)的日志框架切換成為“SLF4J+Logback”。根據(jù)你的Tomcat版本,從這里下載所需要文件。解壓后你會(huì)看到一個(gè)類似于Tomcat替換或拷貝下列這些文件到Tomcat的安裝目錄:刪除啟動(dòng)今天我們談了日志框架與日志門(mén)面的區(qū)別,以及Tomcat的日志模塊是如何實(shí)現(xiàn)的。默認(rèn)情況下,Tomcat的日志模板叫作JULI,JULI的日志門(mén)面采用了JCL,而具體實(shí)現(xiàn)是基于Java默認(rèn)的日志框架JavaUtilLogging,Tomcat在JavaUtilLogging基礎(chǔ)上進(jìn)行了改造,使得它自身的日志框架不會(huì)影響Web式。最后我分享了如何將Tomcat的日志模塊切換到時(shí)下流行的“SLF4J+Logback”,希望對(duì)你有所幫助。OnlineFormatterJavaSimpleFormatterTomcatTomcatconf/perties。我來(lái)拆解一下這個(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用來(lái)區(qū)分不同系統(tǒng)日志的標(biāo)志;后面的字符串表示了Handler具體類型,如果要添加Tomcat服務(wù)器的自定義Handler,需要在字符串里添加。接下來(lái)是每個(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+在今天文章開(kāi)頭我提到,SLF4J和JCLTomcat獨(dú)立部署時(shí),各種日志都輸出到了相應(yīng)的日志文件,假如SpringBoot以內(nèi)嵌式的方式運(yùn)行Tomcat,這種情況下To
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 含砷廢物資源化回收項(xiàng)目可行性研究報(bào)告(參考范文)
- 關(guān)于成立土石方工程公司可行性研究報(bào)告(范文模板)
- 離子泵企業(yè)ESG實(shí)踐與創(chuàng)新戰(zhàn)略研究報(bào)告
- 耦合電容器企業(yè)縣域市場(chǎng)拓展與下沉戰(zhàn)略研究報(bào)告
- 2025年高壓電工技師考試題庫(kù):高壓絕緣技術(shù)現(xiàn)場(chǎng)施工進(jìn)度控制措施解析試題
- 2025年小學(xué)英語(yǔ)畢業(yè)考試模擬試卷:英語(yǔ)歌曲與童謠教學(xué)目標(biāo)實(shí)現(xiàn)度評(píng)估策略研究試題
- 不銹鋼盥洗盆企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級(jí)戰(zhàn)略研究報(bào)告
- 統(tǒng)計(jì)質(zhì)量管理方法在市場(chǎng)營(yíng)銷中的應(yīng)用-2025年統(tǒng)計(jì)學(xué)期末測(cè)試題
- 廂式壓濾機(jī)企業(yè)ESG實(shí)踐與創(chuàng)新戰(zhàn)略研究報(bào)告
- 石料拋光機(jī)床企業(yè)縣域市場(chǎng)拓展與下沉戰(zhàn)略研究報(bào)告
- ADA語(yǔ)言基礎(chǔ)教程
- 電梯結(jié)構(gòu)及原理圖解
- 英語(yǔ)口譯基礎(chǔ)教程UnitIntroduction課件
- 不孕癥診療流程課件
- 初中生物人教七年級(jí)上冊(cè)生物體的結(jié)構(gòu)層次第一節(jié) 細(xì)胞通過(guò)分裂產(chǎn)生新細(xì)胞 導(dǎo)學(xué)案
- 甘肅省煙花爆竹經(jīng)營(yíng)許可實(shí)施標(biāo)準(zhǔn)細(xì)則
- 【精品課件】藥用高分子材料學(xué)
- 要素式起訴狀(離婚糾紛)
- 急性腎盂腎炎護(hù)理查房
- 登臨詩(shī)鑒賞(課堂PPT)
- 蒸壓加氣混凝土砌塊薄層砌筑
評(píng)論
0/150
提交評(píng)論