web server apache tomcat11-22-logging 日誌

来源:https://www.cnblogs.com/houbbBlogs/p/18161067
-Advertisement-
Play Games

前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...


前言

整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。

開源項目

從零手寫實現 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 的內部日誌記錄使用了 JULI,這是 Apache Commons Logging 的打包重命名分支,被硬編碼為使用 java.util.logging 框架。這確保了 Tomcat 的內部日誌記錄和任何 Web 應用程式日誌記錄保持獨立,即使一個 Web 應用程式使用了 Apache Commons Logging。

要配置 Tomcat 使用替代的日誌記錄框架進行內部日誌記錄,請按照替代日誌記錄框架提供的指令,重定向使用 java.util.logging 的應用程式的日誌記錄。請註意,替代的日誌記錄框架需要能夠在存在不同類載入器中具有相同名稱的不同記錄器的環境中工作。

在 Apache Tomcat 上運行的 Web 應用程式可以:

  • 使用任何其選擇的日誌記錄框架。
  • 使用系統日誌記錄 API,java.util.logging。
  • 使用由 Java Servlets 規範提供的日誌記錄 API,jakarta.servlet.ServletContext.log(...)

不同 Web 應用程式使用的日誌記錄框架是獨立的。有關更多詳情,請參閱類載入。唯一的例外是 java.util.logging。如果您的日誌記錄庫直接或間接地使用了它,那麼它的某些元素將在 Web 應用程式之間共用,因為它是由系統類載入器載入的。

Java 日誌記錄 API — java.util.logging

Apache Tomcat 具有 java.util.logging API 的幾個關鍵元素的自己的實現。這個實現被稱為 JULI。其中的關鍵組件是一個自定義的 LogManager 實現,它瞭解正在 Tomcat 上運行的不同 Web 應用程式(及其不同的類載入器)。它支持每個應用程式私有的日誌記錄配置。它還在 Web 應用程式從記憶體中卸載時受到 Tomcat 的通知,以便清除對其類的引用,防止記憶體泄漏。

當啟動 Java 時,通過提供特定的系統屬性來啟用此 java.util.logging 實現。Apache Tomcat 的啟動腳本會為您執行此操作,但如果您使用不同的工具來運行 Tomcat(如 jsvc,或在 IDE 中運行 Tomcat),則應自行處理它們。

有關 java.util.logging 的更多詳細信息可在 JDK 的文檔和其 java.util.logging 包的 Javadoc 頁面中找到。

Servlets 日誌記錄 API

對 jakarta.servlet.ServletContext.log(...) 的調用來寫日誌消息是由內部的 Tomcat 日誌記錄處理的。這樣的消息被記錄到名為

org.apache.catalina.core.ContainerBase.[${engine}].[${host}].[${context}]

的類別中。此日誌記錄根據 Tomcat 日誌記錄配置執行。您無法在 Web 應用程式中覆蓋它。

Servlets 日誌記錄 API 早於現在由 Java 提供的 java.util.logging API。因此,它並不提供太多選項。例如,您無法控制日誌級別。不過,可以註意到,在 Apache Tomcat 實現中,對 ServletContext.log(String) 或 GenericServlet.log(String) 的調用是以 INFO 級別記錄的。對 ServletContext.log(String, Throwable) 或 GenericServlet.log(String, Throwable) 的調用是以 SEVERE 級別記錄的。

控制台

在 Unix 上運行 Tomcat 時,控制台輸出通常會重定向到名為 catalina.out 的文件中。該名稱可使用環境變數進行配置。(參見啟動腳本)。所有寫入到 System.err/out 的內容都將被捕獲到該文件中。這可能包括:

  • 由 java.lang.ThreadGroup.uncaughtException(...) 列印的未捕獲異常
  • 如果通過系統信號請求了線程轉儲,則線程轉儲

在 Windows 上作為服務運行時,控制台輸出也會被捕獲和重定向,但文件名不同。

Apache Tomcat 中的預設日誌記錄配置將相同的

消息寫入控制台和日誌文件。這在開發時使用 Tomcat 時非常方便,但在生產環境中通常是不需要的。

仍在使用 System.out 或 System.err 的舊應用程式可以通過在 Context 上設置 swallowOutput 屬性來欺騙。如果將屬性設置為 true,則在請求處理過程中對 System.out/err 的調用將被攔截,並將其輸出通過 jakarta.servlet.ServletContext.log(...) 調用饋送到日誌子系統中。
請註意,swallowOutput 功能實際上是一個技巧,它有其局限性。它僅適用於對 System.out/err 的直接調用,並且僅在請求處理周期中起作用。它可能無法攔截由應用程式創建的其他線程中的日誌記錄框架。它不能用於攔截那些自己寫入系統流的日誌記錄框架,因為它們早在重定向發生之前就開始,並且可能直接獲得對流的引用。

訪問日誌記錄

訪問日誌記錄是一個相關但不同的功能,它作為一個閥門實現。它使用自包含的邏輯來寫入其日誌文件。訪問日誌記錄的基本要求是處理大量連續數據而不增加太多開銷,因此它僅使用 Apache Commons Logging 用於自身的調試消息。這種實現方法避免了額外的開銷和潛在的複雜配置。有關其配置的更多詳細信息,請參閱閥門文檔,其中包括各種報告格式。

使用 java.util.logging(預設)

JDK 提供的 java.util.logging 的預設實現過於受限,以至於無法使用。關鍵限制是無法實現每個 Web 應用程式的日誌記錄,因為配置是基於 VM 的。因此,在預設配置下,Tomcat 將替換預設的 LogManager 實現為一個容器友好型的實現,稱為 JULI,它解決了這些缺陷。

JULI 支持與標準 JDK java.util.logging 相同的配置機制,使用編程方法或屬性文件。主要區別在於可以設置每個類載入器屬性文件(這樣就可以輕鬆地重新部署友好的 Web 應用程式配置),並且屬性文件支持擴展結構,允許更自由地定義處理程式並將其分配給記錄器。

JULI 預設啟用,並支持每個類載入器配置,除了常規的全局 java.util.logging 配置之外。這意味著日誌記錄可以在以下層次進行配置:

  • 全局配置。通常在 ${catalina.base}/conf/logging.properties 文件中完成。該文件由 java.util.logging.config.file 系統屬性指定,該屬性由啟動腳本設置。如果該文件不可讀或未配置,則預設使用 JRE 中的 ${java.home}/lib/logging.properties 文件。
  • 在 Web 應用程式中。該文件將是 WEB-INF/classes/logging.properties

JRE 中的預設 logging.properties 指定了一個 ConsoleHandler,將日誌路由到 System.err。Apache Tomcat 中預設的 conf/logging.properties 還添加了幾個 AsyncFileHandler,用於寫入文件。

處理程式的日誌級別閾值預設為 INFO,可以使用 SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST 或 ALL 進行設置。您還可以針對特定的包來收集日誌,並指定一個級別。

要為 Tomcat 的部分內部啟用調試日誌記錄,應同時配置適當的記錄器和適當的處理程式,以使用 FINEST 或 ALL 級別。例如:

org.apache.catalina.session.level=ALL
java.util.logging.ConsoleHandler.level=ALL

在啟用調試日誌記錄時,建議將其限制在可能的最窄範圍內,因為調試日誌記錄可能會產生大量信息。

JULI 使用的配置與純 java.util.logging 支持的配置

相同,但使用了一些擴展,以便更好地靈活地配置記錄器和處理程式。主要的區別包括:

  • 可以向處理程式名稱添加首碼,以便可以實例化單個類的多個處理程式。首碼是一個以數字開頭、以 '.' 結尾的字元串。例如,22foobar. 是一個有效的首碼。
  • 對於包含 ${systemPropertyName} 的屬性值,將執行系統屬性替換。
  • 如果使用實現了 org.apache.juli.WebappProperties 介面的類載入器(Tomcat 的 Web 應用程式類載入器會這樣做),則還會對 ${classloader.webappName}、${classloader.hostName} 和 ${classloader.serviceName} 進行屬性替換,分別替換為 Web 應用程式名稱、主機名和服務名稱。
  • 預設情況下,如果日誌記錄器具有關聯處理程式,則日誌記錄器將不委托給其父級。可以使用 loggerName.useParentHandlers 屬性更改每個記錄器的此行為,該屬性接受布爾值。
  • 根記錄器可以使用 .handlers 屬性定義其處理程式集。
  • 預設情況下,日誌文件將在文件系統上保留 90 天。可以使用 handlerName.maxDays 屬性為每個處理程式更改此設置。如果屬性的指定值 ≤0,則日誌文件將永遠保留在文件系統上,否則它們將保留指定的最大天數。
  • 還有一些其他的實現類,可以與 Java 提供的實現類一起使用。值得註意的是 org.apache.juli.FileHandler 和 org.apache.juli.AsyncFileHandler。

org.apache.juli.FileHandler 支持日誌的緩衝。預設情況下,不啟用緩衝。要配置它,請使用處理程式的 bufferSize 屬性。值為 0 使用系統預設緩衝(通常將使用 8K 緩衝)。值 <0 強制在每次日誌寫入時刷新寫入器。值 >0 使用具有定義值的 BufferedOutputStream,但請註意還會應用系統預設緩衝。

org.apache.juli.AsyncFileHandler 是 FileHandler 的子類,它將日誌消息排隊並非同步寫入日誌文件。可以通過設置一些系統屬性來配置其附加行為。

示例 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。

生產使用考慮事項

您可能需要註意以下事項:

考慮從配置中移除 ConsoleHandler。預設情況下(通過 .handlers 設置),日誌會同時發送到 FileHandler 和 ConsoleHandler。後者的輸出通常會被捕獲到一個文件中,比如 catalina.out。因此,您最終會得到相同消息的兩份拷貝。
考慮移除那些您不使用的應用程式的 FileHandlers。例如,host-manager 的一個。
處理程式預設使用系統預設編碼來寫入日誌文件。可以使用 encoding 屬性進行配置。請參閱 Javadoc 獲取詳細信息。
考慮配置訪問日誌。

參考資料

https://tomcat.apache.org/tomcat-11.0-doc/monitoring.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄一、低級別動畫 API1.1 animate*AsState1.2 Animatable1.3 Transition 動畫1.3.1 updateTransition1.3.2 createChildTransition1.3.3 封裝並復用 Transition 動畫1.4 remeberIn ...
  • 前言 鍵鼠事件是指在電腦操作中,用戶通過鍵盤和滑鼠來與電腦進行交互的行為。常見的鍵鼠事件包括按下鍵盤上的鍵、移動滑鼠、點擊滑鼠左鍵或右鍵等等。鍵鼠事件可以觸發許多不同的操作,比如在文本編輯器中輸入文字、在游戲中移動角色、在網頁上點擊鏈接等等。電腦操作系統和應用程式可以通過監聽鍵鼠事件來響應 ...
  • 前言 觸屏事件是指通過觸摸屏幕來進行操作和交互的事件。常見的觸屏事件包括點擊(tap)、雙擊(double tap)、長按(long press)、滑動(swipe)、拖動(drag)等。觸屏事件通常用於移動設備和平板電腦等具有觸摸屏幕的設備上,用戶可以通過觸摸屏幕上的不同區域或者以不同的方式進 ...
  • DTD 是文檔類型定義(Document Type Definition)的縮寫。DTD 定義了 XML 文檔的結構以及合法的元素和屬性。 為什麼使用 DTD 通過使用 DTD,獨立的團體可以就數據交換的標準 DTD 達成一致。 應用程式可以使用 DTD 來驗證 XML 數據的有效性。 內部 DTD ...
  • 其他章節請看: vue3 快速入門 系列 Pinia vue3 狀態管理這裡選擇 pinia。 雖然 vuex4 已支持 Vue 3 的 Composition API,但是 vue3 官網推薦新的應用使用 pinia —— vue3 pinia 集中式狀態管理 redux、mobx、vuex、pi ...
  • a-textarea(textarea)出現模糊問題的可能解決方案 項目介紹:本項目是一個vue3+ant-design-vue4.x開發,是一個客服機器人的組件。其它項目通過iframe+js文件來引入(iframe的內容就是表單,入口按鈕是通過js文件進行dom操作創建)。 通過js監聽頁面寬度 ...
  • 運算符重載:與function overloading異曲同工的是,C++提供所謂的Operator overloading。所謂operators是像 +(加)-(減)*(乘)/(除)>>(位右移)<<(位左移)之類的符號,代表一種動作。 面對operators,我們應該把他想像是一種函數,只不過 ...
  • C-07.InnoDB數據存儲結構 1.資料庫的存儲結構:頁 索引結構給我們提供了高效的索引方式,不過索引信息以及數據記錄都是保存在文件上的,確切說是存儲在頁結構中。另一方面,索引是在存儲引擎中實現的,MySQL伺服器上的存儲引擎負責對錶中數據的讀取和寫入工作。不同存儲引擎中存放的格式一般是不同的, ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...