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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...