前言
整理這個(gè)官方翻譯的系列,原因是網(wǎng)上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。
開源項(xiàng)目
從零手寫實(shí)現(xiàn) tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。
系列文章
web server apache tomcat11-01-官方文檔入門介紹
web server apache tomcat11-02-setup 啟動
web server apache tomcat11-03-deploy 如何部署
web server apache tomcat11-04-manager 如何管理?
web server apache tomcat11-06-Host Manager App -- Text Interface
web server apache tomcat11-07-Realm Configuration
web server apache tomcat11-08-JNDI Resources
web server apache tomcat11-09-JNDI Datasource
web server apache tomcat11-10-Class Loader
web server apache tomcat11-11-Jasper 2 JSP Engine
web server apache tomcat11-12-SSL/TLS Configuration
web server apache tomcat11-13-SSI
web server apache tomcat11-14-CGI
...
簡介
Apache Tomcat 的內(nèi)部日志記錄使用了 JULI,這是 Apache Commons Logging 的打包重命名分支,被硬編碼為使用 java.util.logging 框架。這確保了 Tomcat 的內(nèi)部日志記錄和任何 Web 應(yīng)用程序日志記錄保持獨(dú)立,即使一個(gè) Web 應(yīng)用程序使用了 Apache Commons Logging。
要配置 Tomcat 使用替代的日志記錄框架進(jìn)行內(nèi)部日志記錄,請按照替代日志記錄框架提供的指令,重定向使用 java.util.logging 的應(yīng)用程序的日志記錄。請注意,替代的日志記錄框架需要能夠在存在不同類加載器中具有相同名稱的不同記錄器的環(huán)境中工作。
在 Apache Tomcat 上運(yùn)行的 Web 應(yīng)用程序可以:
- 使用任何其選擇的日志記錄框架。
- 使用系統(tǒng)日志記錄 API,java.util.logging。
- 使用由 Java Servlets 規(guī)范提供的日志記錄 API,jakarta.servlet.ServletContext.log(...)
不同 Web 應(yīng)用程序使用的日志記錄框架是獨(dú)立的。有關(guān)更多詳情,請參閱類加載。唯一的例外是 java.util.logging。如果您的日志記錄庫直接或間接地使用了它,那么它的某些元素將在 Web 應(yīng)用程序之間共享,因?yàn)樗怯上到y(tǒng)類加載器加載的。
Java 日志記錄 API — java.util.logging
Apache Tomcat 具有 java.util.logging API 的幾個(gè)關(guān)鍵元素的自己的實(shí)現(xiàn)。這個(gè)實(shí)現(xiàn)被稱為 JULI。其中的關(guān)鍵組件是一個(gè)自定義的 LogManager 實(shí)現(xiàn),它了解正在 Tomcat 上運(yùn)行的不同 Web 應(yīng)用程序(及其不同的類加載器)。它支持每個(gè)應(yīng)用程序私有的日志記錄配置。它還在 Web 應(yīng)用程序從內(nèi)存中卸載時(shí)受到 Tomcat 的通知,以便清除對其類的引用,防止內(nèi)存泄漏。
當(dāng)啟動 Java 時(shí),通過提供特定的系統(tǒng)屬性來啟用此 java.util.logging 實(shí)現(xiàn)。Apache Tomcat 的啟動腳本會為您執(zhí)行此操作,但如果您使用不同的工具來運(yùn)行 Tomcat(如 jsvc,或在 IDE 中運(yùn)行 Tomcat),則應(yīng)自行處理它們。
有關(guān) java.util.logging 的更多詳細(xì)信息可在 JDK 的文檔和其 java.util.logging 包的 Javadoc 頁面中找到。
Servlets 日志記錄 API
對 jakarta.servlet.ServletContext.log(...) 的調(diào)用來寫日志消息是由內(nèi)部的 Tomcat 日志記錄處理的。這樣的消息被記錄到名為
org.apache.catalina.core.ContainerBase.[${engine}].[${host}].[${context}]
的類別中。此日志記錄根據(jù) Tomcat 日志記錄配置執(zhí)行。您無法在 Web 應(yīng)用程序中覆蓋它。
Servlets 日志記錄 API 早于現(xiàn)在由 Java 提供的 java.util.logging API。因此,它并不提供太多選項(xiàng)。例如,您無法控制日志級別。不過,可以注意到,在 Apache Tomcat 實(shí)現(xiàn)中,對 ServletContext.log(String) 或 GenericServlet.log(String) 的調(diào)用是以 INFO 級別記錄的。對 ServletContext.log(String, Throwable) 或 GenericServlet.log(String, Throwable) 的調(diào)用是以 SEVERE 級別記錄的。
控制臺
在 Unix 上運(yùn)行 Tomcat 時(shí),控制臺輸出通常會重定向到名為 catalina.out 的文件中。該名稱可使用環(huán)境變量進(jìn)行配置。(參見啟動腳本)。所有寫入到 System.err/out 的內(nèi)容都將被捕獲到該文件中。這可能包括:
- 由 java.lang.ThreadGroup.uncaughtException(...) 打印的未捕獲異常
- 如果通過系統(tǒng)信號請求了線程轉(zhuǎn)儲,則線程轉(zhuǎn)儲
在 Windows 上作為服務(wù)運(yùn)行時(shí),控制臺輸出也會被捕獲和重定向,但文件名不同。
Apache Tomcat 中的默認(rèn)日志記錄配置將相同的
消息寫入控制臺和日志文件。這在開發(fā)時(shí)使用 Tomcat 時(shí)非常方便,但在生產(chǎn)環(huán)境中通常是不需要的。
仍在使用 System.out 或 System.err 的舊應(yīng)用程序可以通過在 Context 上設(shè)置 swallowOutput 屬性來欺騙。如果將屬性設(shè)置為 true,則在請求處理過程中對 System.out/err 的調(diào)用將被攔截,并將其輸出通過 jakarta.servlet.ServletContext.log(...) 調(diào)用饋送到日志子系統(tǒng)中。
請注意,swallowOutput 功能實(shí)際上是一個(gè)技巧,它有其局限性。它僅適用于對 System.out/err 的直接調(diào)用,并且僅在請求處理周期中起作用。它可能無法攔截由應(yīng)用程序創(chuàng)建的其他線程中的日志記錄框架。它不能用于攔截那些自己寫入系統(tǒng)流的日志記錄框架,因?yàn)樗鼈冊缭谥囟ㄏ虬l(fā)生之前就開始,并且可能直接獲得對流的引用。
訪問日志記錄
訪問日志記錄是一個(gè)相關(guān)但不同的功能,它作為一個(gè)閥門實(shí)現(xiàn)。它使用自包含的邏輯來寫入其日志文件。訪問日志記錄的基本要求是處理大量連續(xù)數(shù)據(jù)而不增加太多開銷,因此它僅使用 Apache Commons Logging 用于自身的調(diào)試消息。這種實(shí)現(xiàn)方法避免了額外的開銷和潛在的復(fù)雜配置。有關(guān)其配置的更多詳細(xì)信息,請參閱閥門文檔,其中包括各種報(bào)告格式。
使用 java.util.logging(默認(rèn))
JDK 提供的 java.util.logging 的默認(rèn)實(shí)現(xiàn)過于受限,以至于無法使用。關(guān)鍵限制是無法實(shí)現(xiàn)每個(gè) Web 應(yīng)用程序的日志記錄,因?yàn)榕渲檬腔?VM 的。因此,在默認(rèn)配置下,Tomcat 將替換默認(rèn)的 LogManager 實(shí)現(xiàn)為一個(gè)容器友好型的實(shí)現(xiàn),稱為 JULI,它解決了這些缺陷。
JULI 支持與標(biāo)準(zhǔn) JDK java.util.logging 相同的配置機(jī)制,使用編程方法或?qū)傩晕募?。主要區(qū)別在于可以設(shè)置每個(gè)類加載器屬性文件(這樣就可以輕松地重新部署友好的 Web 應(yīng)用程序配置),并且屬性文件支持?jǐn)U展結(jié)構(gòu),允許更自由地定義處理程序并將其分配給記錄器。
JULI 默認(rèn)啟用,并支持每個(gè)類加載器配置,除了常規(guī)的全局 java.util.logging 配置之外。這意味著日志記錄可以在以下層次進(jìn)行配置:
- 全局配置。通常在 ${catalina.base}/conf/logging.properties 文件中完成。該文件由 java.util.logging.config.file 系統(tǒng)屬性指定,該屬性由啟動腳本設(shè)置。如果該文件不可讀或未配置,則默認(rèn)使用 JRE 中的 ${java.home}/lib/logging.properties 文件。
- 在 Web 應(yīng)用程序中。該文件將是 WEB-INF/classes/logging.properties
JRE 中的默認(rèn) logging.properties 指定了一個(gè) ConsoleHandler,將日志路由到 System.err。Apache Tomcat 中默認(rèn)的 conf/logging.properties 還添加了幾個(gè) AsyncFileHandler,用于寫入文件。
處理程序的日志級別閾值默認(rèn)為 INFO,可以使用 SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST 或 ALL 進(jìn)行設(shè)置。您還可以針對特定的包來收集日志,并指定一個(gè)級別。
要為 Tomcat 的部分內(nèi)部啟用調(diào)試日志記錄,應(yīng)同時(shí)配置適當(dāng)?shù)挠涗浧骱瓦m當(dāng)?shù)奶幚沓绦?,以使?FINEST 或 ALL 級別。例如:
org.apache.catalina.session.level=ALL
java.util.logging.ConsoleHandler.level=ALL
在啟用調(diào)試日志記錄時(shí),建議將其限制在可能的最窄范圍內(nèi),因?yàn)檎{(diào)試日志記錄可能會產(chǎn)生大量信息。
JULI 使用的配置與純 java.util.logging 支持的配置
相同,但使用了一些擴(kuò)展,以便更好地靈活地配置記錄器和處理程序。主要的區(qū)別包括:
- 可以向處理程序名稱添加前綴,以便可以實(shí)例化單個(gè)類的多個(gè)處理程序。前綴是一個(gè)以數(shù)字開頭、以 '.' 結(jié)尾的字符串。例如,22foobar. 是一個(gè)有效的前綴。
- 對于包含 ${systemPropertyName} 的屬性值,將執(zhí)行系統(tǒng)屬性替換。
- 如果使用實(shí)現(xiàn)了 org.apache.juli.WebappProperties 接口的類加載器(Tomcat 的 Web 應(yīng)用程序類加載器會這樣做),則還會對 ${classloader.webappName}、${classloader.hostName} 和 ${classloader.serviceName} 進(jìn)行屬性替換,分別替換為 Web 應(yīng)用程序名稱、主機(jī)名和服務(wù)名稱。
- 默認(rèn)情況下,如果日志記錄器具有關(guān)聯(lián)處理程序,則日志記錄器將不委托給其父級??梢允褂?loggerName.useParentHandlers 屬性更改每個(gè)記錄器的此行為,該屬性接受布爾值。
- 根記錄器可以使用 .handlers 屬性定義其處理程序集。
- 默認(rèn)情況下,日志文件將在文件系統(tǒng)上保留 90 天。可以使用 handlerName.maxDays 屬性為每個(gè)處理程序更改此設(shè)置。如果屬性的指定值 ≤0,則日志文件將永遠(yuǎn)保留在文件系統(tǒng)上,否則它們將保留指定的最大天數(shù)。
- 還有一些其他的實(shí)現(xiàn)類,可以與 Java 提供的實(shí)現(xiàn)類一起使用。值得注意的是 org.apache.juli.FileHandler 和 org.apache.juli.AsyncFileHandler。
org.apache.juli.FileHandler 支持日志的緩沖。默認(rèn)情況下,不啟用緩沖。要配置它,請使用處理程序的 bufferSize 屬性。值為 0 使用系統(tǒng)默認(rèn)緩沖(通常將使用 8K 緩沖)。值 <0 強(qiáng)制在每次日志寫入時(shí)刷新寫入器。值 >0 使用具有定義值的 BufferedOutputStream,但請注意還會應(yīng)用系統(tǒng)默認(rèn)緩沖。
org.apache.juli.AsyncFileHandler 是 FileHandler 的子類,它將日志消息排隊(duì)并異步寫入日志文件??梢酝ㄟ^設(shè)置一些系統(tǒng)屬性來配置其附加行為。
示例 logging.properties 文件,放置在 $CATALINA_BASE/conf 中:
handlers = 1catalina.org.apache.juli.FileHandler, \
2localhost.org.apache.juli.FileHandler, \
3manager.org.apache.juli.FileHandler, \
java.util.logging.ConsoleHandler
.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.
1catalina.org.apache.juli.FileHandler.maxDays = 90
1catalina.org.apache.juli.FileHandler.encoding = UTF-8
2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.
2localhost.org.apache.juli.FileHandler.maxDays = 90
2localhost.org.apache.juli.FileHandler.encoding = UTF-8
3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.
3manager.org.apache.juli.FileHandler.bufferSize = 16384
3manager.org.apache.juli.FileHandler.maxDays = 90
3manager.org.apache.juli.FileHandler.encoding = UTF-8
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.OneLineFormatter
java.util.logging.ConsoleHandler.encoding = UTF-8
############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \
2localhost.org.apache.juli.FileHandler
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \
3manager.org.apache.juli.FileHandler
# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE
Example logging.properties for the servlet-examples web application to be placed in WEB-INF/classes inside the web application:
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
org.apache.juli.FileHandler.prefix = ${classloader.webappName}.
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.OneLineFormatter
文檔參考
請查閱以下資源獲取更多信息:
Apache Tomcat 的 org.apache.juli 包的 Javadoc。
Oracle Java 11 的 java.util.logging 包的 Javadoc。
生產(chǎn)使用考慮事項(xiàng)
您可能需要注意以下事項(xiàng):
考慮從配置中移除 ConsoleHandler。默認(rèn)情況下(通過 .handlers 設(shè)置),日志會同時(shí)發(fā)送到 FileHandler 和 ConsoleHandler。后者的輸出通常會被捕獲到一個(gè)文件中,比如 catalina.out。因此,您最終會得到相同消息的兩份拷貝。
考慮移除那些您不使用的應(yīng)用程序的 FileHandlers。例如,host-manager 的一個(gè)。
處理程序默認(rèn)使用系統(tǒng)默認(rèn)編碼來寫入日志文件。可以使用 encoding 屬性進(jìn)行配置。請參閱 Javadoc 獲取詳細(xì)信息。
考慮配置訪問日志。文章來源:http://www.zghlxwxcb.cn/news/detail-859330.html
參考資料
https://tomcat.apache.org/tomcat-11.0-doc/monitoring.html文章來源地址http://www.zghlxwxcb.cn/news/detail-859330.html
到了這里,關(guān)于web server apache tomcat11-22-logging 日志的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!