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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...