Log4j

Apache log4j
開發者Apache软件基金会
首次发布2001年1月8日,​23年前​(2001-01-08[1]
当前版本
  • 2.23.1 (2024年3月10日;穩定版本)[2]
編輯維基數據鏈接
源代码库
  • github.com/apache/logging-log4j2
編輯維基數據鏈接
编程语言Java
操作系统跨平台
类型日志工具
许可协议Apache许可证 2.0版
网站http://logging.apache.org/log4j

Apache Log4j是一个基于Java的日志记录工具。它是由瑞士程式設計師Ceki Gülcü於2001年开发的,现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架英语Java logging framework之一。

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的支持。

参考文献

  1. ^ Apache log4j 1.2 Release History. apache.org. Apache Software Foundation. [2014-09-02]. (原始内容存档于2020-12-02). 
  2. ^ 2.0 2.1 Release 2.23.1. 2024年3月10日 [2024年3月22日]. 
  3. ^ Log4j – Changes - Apache Log4j 2. apache.org. Apache Software Foundation. [2021-12-18]. (原始内容存档于2022-04-25). 
  4. ^ Log4j Guide. Apache Software Foundation. [2014-07-14]. (原始内容存档于2020-11-21). 
  5. ^ What's the Deal with the Log4Shell Security Nightmare?. Lawfare. December 10, 2021 [2021-12-12]. (原始内容存档于2022-04-26). 
  6. ^ Press, Associated. Recently uncovered software flaw ‘most critical vulnerability of the last decade’. the Guardian. December 11, 2021 [2021-12-12]. (原始内容存档于2022-04-15). 
  7. ^ Level (Apache Log4j 1.2.17 API). Apache Software Foundation. [2014-07-14]. (原始内容存档于2020-08-03). 
  8. ^ MDC内部使用了类似map的机制来存储相关信息,信息是以它的key值存储在“map”中。
  9. ^ Logging Framework for C 项目主页. SourceForge. [2014-07-16]. (原始内容存档于2019-04-30). 
  10. ^ Log4js主页. [2017-09-05]. (原始内容存档于2013-09-07). 
  11. ^ Tim Down. log4javascript. [2014-07-16]. (原始内容存档于2020-07-31). 
  12. ^ Mattijs Perdeck. JSNLog. [2014-07-16]. (原始内容存档于2020-12-03). 
  13. ^ Apache log4net. http://logging.apache.org/log4net/. Apache Software Foundation.  缺少或|url=为空 (帮助); 使用|accessdate=需要含有|url= (帮助); 外部链接存在于|work= (帮助)
  14. ^ Github Log4perl homepage. [2014-07-14]. (原始内容存档于2013-01-23). 
  15. ^ Rubyforge Log4jr homepage. [2017-09-05]. (原始内容存档于2012-12-25). 
  16. ^ 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 

参见

  • 自由软件主题
  • Java主题
  • Chainsaw英语Chainsaw (log file viewer)
  • Log4Shell——2021年Log4j 2.0发现的最严重的漏洞

外部链接

顶级项目
  • Abdera英语Apache Abdera
  • Accumulo英语Apache Accumulo
  • ActiveMQ
  • Ambari英语Apache Ambari
  • Ant
  • Aries英语Apache Aries
  • Apache Arrow
  • Apache HTTP Server
  • APR
  • Avro
  • Axis
  • Axis2
  • Beam
  • Bloodhound英语Apache Bloodhound
  • Apache Brooklyn英语Apache Brooklyn
  • Buildr英语Apache Buildr
  • Calcite英语Apache Calcite
  • Camel
  • Cassandra
  • Cayenne英语Apache Cayenne
  • Chemistry英语Apache Chemistry
  • CloudStack英语Apache CloudStack
  • Cocoon英语Apache Cocoon
  • Continuum英语Apache Continuum
  • Cordova
  • CouchDB
  • cTAKES英语cTAKES
  • CXF
  • Deltacloud英语Deltacloud
  • Derby
  • Directory英语Apache Directory Server
  • Drill英语Apache Drill
  • Empire-db英语Apache Empire-db
  • ECharts
  • Felix英语Apache Felix
  • Flex
  • Flink
  • Flume英语Apache Flume
  • Forrest英语Apache Forrest
  • Geronimo英语Apache Geronimo
  • Gora英语Apache Gora
  • Gump英语Apache Gump
  • Hadoop
  • Hama英语Apache Hama
  • HBase
  • Hive
  • Jackrabbit英语Apache Jackrabbit
  • James英语Apache James
  • JMeter英语Apache JMeter
  • Kafka
  • Karaf英语Apache Karaf
  • Kylin英语Apache Kylin
  • Lucene
  • Lenya英语Apache Lenya
  • Mahout英语Apache Mahout
  • Marmotta英语Apache Marmotta
  • Maven
  • MINA英语Apache MINA
  • mod_perl英语mod_perl
  • MyFaces英语Apache MyFaces
  • Nutch英语Apache Nutch
  • ODE英语Apache ODE
  • OFBiz英语Apache OFBiz
  • Oozie英语Oozie
  • OpenEJB英语Apache OpenEJB
  • OpenJPA英语Apache OpenJPA
  • OpenNLP
  • OpenOffice
  • PDFBox英语Apache PDFBox
  • Phoenix英语Apache Phoenix
  • POI
  • Pig英语Pig (programming tool)
  • Pivot英语Apache Pivot
  • Qpid英语Apache Qpid
  • River英语Apache River
  • Roller英语Apache Roller
  • RocketMQ
  • Samza英语Apache Samza
  • ServiceMix英语Apache ServiceMix
  • Shindig英语Apache Shindig
  • Shiro
  • Sling英语Apache Sling
  • Spark
  • Stanbol英语Apache Stanbol
  • Storm
  • SpamAssassin
  • Sqoop
  • Apache C++标准库英语stdcxx
  • Struts
  • Struts 2
  • Subversion
  • Tapestry
  • Thrift
  • Tiles英语Apache Tiles
  • Tika英语Apache Tika
  • Tomcat
  • Trafficserver
  • Turbine
  • Tuscany
  • UIMA
  • Velocity
  • Wave
  • Wicket
  • Wink英语Apache Wink
  • Xalan英语Xalan
  • Xerces英语Xerces
  • XMLBeans英语XMLBeans
  • ZooKeeper
ASF logo
Commons项目
  • Apache Commons Logging英语Apache Commons Logging
  • BCEL英语Byte Code Engineering Library
  • BSF英语Bean Scripting Framework
  • Commons Daemon英语Commons Daemon
  • Jelly英语Apache Jelly
Lucene项目
  • Lucene Java
  • Lucene.Net英语Lucene.Net
  • Nutch英语Nutch
  • Solr
Hadoop项目
其他项目
  • Batik
  • Chainsaw英语Chainsaw (log file viewer)
  • FOP
  • Log4j
  • XAP英语Apache XAP
  • Log4Net
  • Ivy英语Apache Ivy
孵化器项目
  • XAP英语Apache XAP
  • Samza英语Apache Samza
  • Storm
Apache Attic
  • AxKit英语AxKit
  • Beehive英语Apache Beehive
  • Click英语Apache Click
  • Apache BlueSky英语BlueSky Open Platform
  • Cactus英语Jakarta Cactus
  • Jakarta
  • Excalibur英语Apache Excalibur
  • Harmony
  • HiveMind英语Apache HiveMind
  • Lenya英语Apache Lenya
  • Slide英语Jakarta Slide
  • Shale英语Apache Shale
  • Shindig英语Apache Shindig
  • stdcxx英语Apache C++ Standard Library
  • iBATIS
  • XMLBeans英语XMLBeans
许可证标准
  • 分类 分类
  • 共享资源页面 维基共享