Apache Log4j 是一個基於 Java 的日誌記錄工具。它是由瑞士程式設計師 Ceki Gülcü 於 2001 年開發的，現在則是 Apache 軟體基金會的一個專案。 Log4j 是幾種之一。 Gülcü 此後開創了 SLF4J 和 Logback 專案，想使其成為 Log4j 的繼任者。 Log4j 團隊建立了 Log4j 的繼任者，版本號為 20 的新版本。Log4j 20 著重於 Log4j 12、13、javautillogging 和 logback 中的問題，並解決這些框架中的架構問題。此外，Log4j 20 提供了一個外掛架構，這使得其更可擴充套件。Log4j 20 不是與 1x 向後相容的版本，雖然有一個 介面卡 可用。 2021 年 12 月 9 日，Log4j 20 的一個零日遠端程式碼執行漏洞被報告，其被稱為 Log4Shell，公共漏洞和暴露編號為 CVE202144228。它被定性為 過去十年來最大、最關鍵的漏洞。 log4j 1 的日誌等級 下表中定義的 log4j 1 的日誌級別和訊息，以嚴重性遞減排序。左欄列出了 log4j 的日誌級別定義，右列提供了每個日誌級別的簡要說明。 級別 描述 OFF 最高級別，用於關閉日誌記錄。 FATAL 導致應用程式提前終止的嚴重錯誤。一般這些資訊將立即呈現在狀態控制檯上。 ERROR 其他執行時錯誤或意外情況。一般這些資訊將立即呈現在狀態控制檯上。 WARN 使用已過時的 API，API 的濫用，潛在錯誤，其他不良的或意外的執行時的狀況（但不一定是錯誤的）。一般這些資訊將立即呈現在狀態控制檯上。 INFO 令人感興趣的執行時事件（啟動 關閉）。一般這些資訊將立即呈現在狀態控制檯上，因而要保守使用，並保持到最低限度。 DEBUG 流經系統的詳細資訊。一般這些資訊只記錄到日誌檔案中。 TRACE 最詳細的資訊。一般這些資訊只記錄到日誌檔案中。自版本 1212。 配置 Log4j 12 有三種方法來配置 log4j：透過properties 檔案，透過 XML 檔案，透過 Java 程式碼。透過上述任意方法，你可以定義 log4j 的三個主要元件：Logger、Appender 和 Layout。透過檔案配置 log4j，具有無需修改應用即可開啟或關閉日誌的好處。例如，應用程式可以在日誌關閉的情況下執行，直到問題出現後，再日誌功能可以簡單地透過修改配置檔案重新開啟。 Logger（記錄器）是日誌的邏輯檔名。其使用已知的 Java 應用程式的名稱。每個記錄器當前以什麼日誌記錄級別（FATAL、ERROR 等）記錄是獨立配置的。在 log4j 的早期版本中，這些被稱為類別（category）和優先順序（priority），但現在他們分別被稱為 logger（記錄器）和 level（級別）。 實際的輸出是透過 Appender（輸出源）。有許多可用的 Appender，比如 FileAppender、ConsoleAppender、SocketAppender、SyslogAppender、NTEventLogAppender，甚至 SMTPAppender。多個 Appender 可以被關聯到任何 Logger 上，所以可以到多個輸出檔案上記錄相同的資訊，例如同時到一個本地檔案和透過套接字監聽器到另一臺計算機上。 Appender 使用 Layout（佈局）格式化日誌條目。常用的格式化為 一次一行 式日誌檔案的佈局是 PatternLayout，其使用一個模式字串，就像 CC 函式 printf 那樣。此外還有 HTMLLayout 和 XMLLayout，使用 HTML 或 XML 格式的時候會更方便。 要除錯一個表現異常的配置檔案，使用 Java VM 引數 Dlog4jdebug 透過標準輸出輸出 Log4j 自身的資訊。要獲知 log4jpropeties 的路徑，檢查 getClass getResource log4jproperties 或 getClass getResource log4jxml。 log4j 還有一個隱含的 未配置 配置，即一個缺乏 log4j 的配置但使用了 log4j 的 Java 應用程式。這將把一個警告（該程式未配置 log4j）列印到標準輸出，並提供 log4j 網站的 URL，在那裡可以找到警告和配置的詳細資訊。除了列印此警告，未配置的 log4j 的應用程式不會列印 INFO、DEBUG 或 TRACE 級別的訊息，而且還可能不輸出更高級別的訊息。 log4j 12 配置示例 xml version10 encodingUTF8 DOCTYPE log4jconfiguration PUBLIC LOGGER httploggingapacheorglog4j12apidocsorgapachelog4jxmldocfileslog4jdtd log4jconfiguration appender 指定輸出目的地，如控制檯或檔案； appender 的名稱任意 appender namestdout classorgapachelog4jConsoleAppender layout classorgapachelog4jPatternLayout param nameConversionPattern value d ABSOLUTE 5p c 1 L m n layout appender category（類別）為 orgspringframework 的 logger 只記錄 level 為 info 或更高級別的訊息； 即：如果您使用的類名獲取 logger（如 LoggergetLogger AClassclass） 而且 AClass 是 orgspringframework 包的一部分，則它屬於這一 category logger nameorgspringframework level valueinfo logger spring 的所有日誌訊息都被設定為 info 等級，但對於類 PropertyEditorRegistrySupport， 我們想將其日誌訊息設定為 debug 等級 logger nameorgspringframeworkbeansPropertyEditorRegistrySupport level valuedebug logger logger nameorgacegisecurity level valueinfo logger root 所有日誌訊息的級別為 debug 或更高的將被記錄，除非另有定義 所有日誌訊息將都記錄到 appender stdout 中，除非另有定義 level valuedebug appenderref refstdout root log4jconfiguration TTCC TTCC 是 log4j 使用的訊息格式。TTCC 是 Time Thread Category Component（時間、執行緒、類別、元件）的縮寫。例如，採用以下模式（pattern）： r t 5p c x m n 模式轉換表為： 模式引數 描述 r 用於輸出從 layout（佈局）的構建到日誌事件建立所經過的毫秒數。 t 用來輸出生成該日誌事件的執行緒的名稱。 p 用於輸出日誌事件的優先順序。 c 用於輸出日誌事件的 category（類別）。 x 用於輸出與產生該日誌事件的執行緒相關聯的 NDC（巢狀診斷上下文，nested diagnostic context）。 X key 用於輸出與產生指定的 key 的日誌事件的執行緒相關聯的 MDC （對映診斷上下文，mapped diagnostic context）MDC 內部使用了類似 map 的機制來儲存相關資訊，資訊是以它的 key 值儲存在 map 中。 m 用於輸出與日誌記錄事件相關聯的應用程式提供的訊息。 n 用來輸出該其所在的特定平臺的換行字元。 示例輸出 467 main INFO orgapachelog4jexamplesSort Exiting main method 移植 log4c 一個 C 語言下的移植。最新的版本為 2013 年釋出的 124 版。該專案已不再活躍。 log4js 一個 JavaScript 下的移植。最新的版本為 2008 年釋出的 11 版。 log4javascript JavaScript 下的另一個移植。最新的版本為 2014 年 5 月釋出的 146 版。 JSNLog JavaScript 下的另一移植。在 2014 年 7 月，最新的版本為 271，並且定期更新。 Apache Log4net 微軟NET Framework 下的移植。最新的版本為 2013 年釋出的 1213。 log4perl log4j 日誌軟體包在一個 Perl 下的移植。最新的版本為 2014 年 5 月釋出的 144。 log4r 一個 Ruby 下的 移植。 PLSQLLoggingUtility log4j 在 PLSQL 下的一種實現。 Log4db2 一個為使用 SQL 命令和 SQL PL 程式碼的 DB2 LUW 的日誌記錄工具 Apache Log4j 2 Apache Log4j 2 是 Log4j 1 的繼任者，2014 年 7 月其 GA 版本（正式釋出版）釋出。該框架被從頭重寫，並從現有的日誌解決方案中獲得靈感（包括 Log4j 1 和 JUL）。該版本與 Log4j 1 的主要差異是： 改進的配置語法 支援 XML 和 JSON 配置 改進的過濾器 屬性（Property）支援 標記 提高速度 模組化：Log4j 2 支援外掛系統 提高了可靠性 配置自動重灌 Log4j 2 的最被認可的特點之一是 非同步記錄器 的效能。Log4j 2 利用了 LMAX Disruptor 。例如，在相同的環境下，Log4j 2 可以寫每秒超過 18000000 條資訊，而其他框架（像 Logback 和 Log4j 1）每秒只能寫 2000000 條訊息。 Log4j 2 提供對 SLF4J、Commons Logging、Apache Flume 和 Log4j 1 的支援。 參考文獻 延展閱讀 參見 Log4Shell2021 年 Log4j 20 發現的最嚴重的漏洞 外部連結 log4j 官方主頁 CategoryApache 軟體基金會 Category 用 Java 程式設計的自由軟體