log4j
開發者 | Apache軟體基金會 |
---|---|
首次發布 | 2001年1月8日[1] |
目前版本 | 2.24.1[2](2024年9月29日,43天前)[3] |
原始碼庫 | |
程式語言 | Java |
作業系統 | 跨平台 |
類型 | 紀錄檔工具 |
許可協定 | Apache許可證 2.0版 |
網站 | http://logging.apache.org/log4j |
Apache Log4j是一個基於Java的紀錄檔記錄工具。它是由瑞士程式設計師Ceki Gülcü於2001年開發的,現在則是Apache軟體基金會的一個專案。 Log4j是幾種Java紀錄檔框架之一。
Gülcü此後開創了SLF4J和Logback 專案,想使其成為Log4j的繼任者。
Log4j團隊建立了Log4j的繼任者,版本號為2.0的新版本。Log4j 2.0著重於Log4j 1.2、1.3、java.util.logging和logback中的問題,並解決這些框架中的架構問題。此外,Log4j 2.0提供了一個外掛程式架構,這使得其更可延伸。Log4j 2.0不是與1.x向下相容的版本[4],雖然有一個「配接器」可用。
2021年12月9日,Log4j 2.0的一個零日遠端代碼執行漏洞被報告,其被稱為「Log4Shell」,公共漏洞和暴露編號為CVE-2021-44228[5]。它被定性為「過去十年來最大、最關鍵的漏洞」[6]。
log4j 1的紀錄檔等級
[編輯]下表中定義的log4j 1的紀錄檔級別和訊息,以嚴重性遞減排序。左欄列出了log4j的紀錄檔級別定義,右列提供了每個紀錄檔級別的簡要說明。
級別 | 描述 |
---|---|
OFF | 最進階別,用於關閉紀錄檔記錄。 |
FATAL | 導致應用程式提前終止的嚴重錯誤。一般這些資訊將立即呈現在狀態控制台上。 |
ERROR | 其他執行時錯誤或意外情況。一般這些資訊將立即呈現在狀態控制台上。 |
WARN | 使用已過時的API,API的濫用,潛在錯誤,其他不良的或意外的執行時的狀況(但不一定是錯誤的)。一般這些資訊將立即呈現在狀態控制台上。 |
INFO | 令人感興趣的執行時事件(啟動/關閉)。一般這些資訊將立即呈現在狀態控制台上,因而要保守使用,並保持到最低限度。 |
DEBUG | 流經系統的詳細資訊。一般這些資訊只記錄到紀錄檔檔案中。 |
TRACE | 最詳細的資訊。一般這些資訊只記錄到紀錄檔檔案中。自版本1.2.12[7]。 |
組態Log4j 1.2
[編輯]有三種方法來組態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,其使用一個模式字串,就像C/C++函式printf那樣。此外還有HTMLLayout和XMLLayout,使用HTML或XML格式的時候會更方便。
要除錯一個表現異常的設定檔,使用Java VM參數-Dlog4j.debug
通過標準輸出輸出Log4j自身的資訊。要獲知log4j.propeties的路徑,檢查getClass().getResource("/log4j.properties")
或getClass().getResource("/log4j.xml")
。
log4j還有一個隱含的「未組態」組態,即一個缺乏log4j的組態但使用了log4j的Java應用程式。這將把一個警告(該程式未組態log4j)列印到標準輸出,並提供log4j網站的URL,在那裡可以找到警告和組態的詳細資訊。除了列印此警告,未組態的log4j的應用程式不會列印INFO、DEBUG或TRACE級別的訊息,而且還可能不輸出更進階別的訊息。
log4j 1.2 組態範例
[編輯]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration>
<!--
appender指定输出目的地,如控制台或文件;
appender的名称任意
-->
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" />
</layout>
</appender>
<!--
category(类别)为'org.springframework'的logger只记录level为“info”或更高级别的消息;
即:如果您使用的类名获取logger(如Logger.getLogger(AClass.class))
而且AClass是org.springframework包的一部分,则它属于这一category
-->
<logger name="org.springframework">
<level value="info"/>
</logger>
<!--
spring的所有日志消息都被设置为“info”等级,但对于类PropertyEditorRegistrySupport,
我们想将其日志消息设置为“debug”等级
-->
<logger name="org.springframework.beans.PropertyEditorRegistrySupport">
<level value="debug"/>
</logger>
<logger name="org.acegisecurity">
<level value="info"/>
</logger>
<root>
<!--
所有日志消息的级别为“debug”或更高的将被记录,除非另有定义
所有日志消息将都记录到appender “stdout”中,除非另有定义
-->
<level value="debug" />
<appender-ref ref="stdout" />
</root>
</log4j:configuration>
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)[8] |
%m | 用於輸出與紀錄檔記錄事件相關聯的應用程式提供的訊息。 |
%n | 用來輸出該其所在的特定平台的換行字元。 |
範例輸出
467 [main] INFO org.apache.log4j.examples.Sort - Exiting main method.
移植
[編輯]- log4c——一個C語言下的移植。最新的版本為2013年發布的1.2.4版。該專案已不再活躍。[9]
- log4js——一個JavaScript下的移植。最新的版本為2008年發布的1.1版。[10]
- log4javascript (頁面存檔備份,存於網際網路檔案館)——JavaScript下的另一個移植。最新的版本為2014年5月發布的1.4.6版。[11]
- JSNLog (頁面存檔備份,存於網際網路檔案館)——JavaScript下的另一移植。在2014年7月,最新的版本為2.7.1,並且定期更新。[12]
- Apache Log4net——微軟.NET Framework下的移植。最新的版本為2013年發布的1.2.13。[13]
- log4perl (頁面存檔備份,存於網際網路檔案館)——log4j紀錄檔軟體套件在一個Perl下的移植。最新的版本為2014年5月發布的1.44。[14]
- log4r——一個Ruby下的「移植」。[15]
- PL-SQL-Logging-Utility (頁面存檔備份,存於網際網路檔案館)——log4j在PL/SQL下的一種實現。
- Log4db2 (頁面存檔備份,存於網際網路檔案館)——一個為使用SQL命令和SQL PL代碼的DB2 LUW的紀錄檔記錄工具
Apache Log4j 2
[編輯]Apache Log4j 2是Log4j 1的繼任者,2014年7月其GA版本(正式發布版)發布。該框架被從頭重寫,並從現有的紀錄檔解決方案中獲得靈感(包括Log4j 1和JUL)。該版本與Log4j 1的主要差異是:[16]
- 改進的組態語法
- 支援XML和JSON組態
- 改進的過濾器
- 屬性(Property)支援
- 標記
- 提高速度
- 模組化:Log4j 2支援外掛程式系統
- 提高了可靠性
- 組態自動重新安裝
Log4j 2的最被認可的特點之一是「非同步記錄器」的效能。Log4j 2利用了LMAX Disruptor (頁面存檔備份,存於網際網路檔案館)。例如,在相同的環境下,Log4j 2可以寫每秒超過18,000,000條資訊,而其他框架(像Logback和Log4j 1)每秒只能寫< 2,000,000條訊息。
Log4j 2提供對SLF4J、Commons Logging、Apache Flume和Log4j 1的支援。
參考文獻
[編輯]- ^ Apache log4j 1.2 Release History. apache.org. Apache Software Foundation. [2014-09-02]. (原始內容存檔於2020-12-02).
- ^ 2.0 2.1 Release 2.24.1. 2024年9月29日 [2024年10月22日].
- ^ Log4j – Changes - Apache Log4j 2. apache.org. Apache Software Foundation. [2021-12-18]. (原始內容存檔於2022-04-25).
- ^ Log4j Guide. Apache Software Foundation. [2014-07-14]. (原始內容存檔於2020-11-21).
- ^ What's the Deal with the Log4Shell Security Nightmare?. Lawfare. December 10, 2021 [2021-12-12]. (原始內容存檔於2022-04-26).
- ^ Press, Associated. Recently uncovered software flaw ‘most critical vulnerability of the last decade’. the Guardian. December 11, 2021 [2021-12-12]. (原始內容存檔於2022-04-15).
- ^ Level (Apache Log4j 1.2.17 API). Apache Software Foundation. [2014-07-14]. (原始內容存檔於2020-08-03).
- ^ MDC內部使用了類似map的機制來儲存相關資訊,資訊是以它的key值儲存在「map」中。
- ^ Logging Framework for C 项目主页. SourceForge. [2014-07-16]. (原始內容存檔於2019-04-30).
- ^ Log4js主页. [2017-09-05]. (原始內容存檔於2013-09-07).
- ^ Tim Down. log4javascript. [2014-07-16]. (原始內容存檔於2020-07-31).
- ^ Mattijs Perdeck. JSNLog. [2014-07-16]. (原始內容存檔於2020-12-03).
- ^ Apache log4net. http://logging.apache.org/log4net/. Apache Software Foundation. 外部連結存在於
|work=
(幫助) - ^ Github Log4perl homepage. [2014-07-14]. (原始內容存檔於2013-01-23).
- ^ Rubyforge Log4jr homepage. [2017-09-05]. (原始內容存檔於2012-12-25).
- ^ Christian Grobmeier. The new log4j 2.0. [2014-07-14]. (原始內容存檔於2015-11-23).
延展閱讀
[編輯]- Gülcü, Ceki, The Complete Log4j Manual 2nd, QOS.ch: 204, February 2010, ISBN 978-2-9700369-0-6
- Gupta, Samudra, Pro Apache Log4j 2nd, Apress: 224, June 22, 2005, ISBN 978-1-59059-499-5