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向后兼容的版本，虽然有一个“适配器”可用。 2021年12月9日，Log4j 2.0的一个零日远程代码执行漏洞被报告，其被称为“Log4Shell”，公共漏洞和暴露編號為CVE-2021-44228。它被定性为“过去十年来最大、最关键的漏洞”。 下表中定义的log4j 1的日志级别和消息，以严重性递减排序。左栏列出了log4j的日志级别定义，右列提供了每个日志级别的简要说明。 有三种方法来配置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级别的消息，而且还可能不输出更高级别的消息。 <?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是log4j使用的消息格式。TTCC是Time Thread Category Component（时间、线程、类别、组件）的缩写。例如，采用以下模式（pattern）： %r [%t] %-5p %c %x - %m%n 模式转换表为： 示例输出 467 [main] INFO org.apache.log4j.examples.Sort - Exiting main method. log4c——一个C语言下的移植。最新的版本为2013年发布的1.2.4版。该项目已不再活跃。 log4js——一个JavaScript下的移植。最新的版本为2008年发布的1.1版。 log4javascript （页面存档备份，存于互联网档案馆）——JavaScript下的另一个移植。最新的版本为2014年5月发布的1.4.6版。 JSNLog （页面存档备份，存于互联网档案馆）——JavaScript下的另一移植。在2014年7月，最新的版本为2.7.1，并且定期更新。 Apache Log4net——微软.NET Framework下的移植。最新的版本为2013年发布的1.2.13。 log4perl （页面存档备份，存于互联网档案馆）——log4j日志软件包在一个Perl下的移植。最新的版本为2014年5月发布的1.44。 log4r——一个Ruby下的“移植”。 PL-SQL-Logging-Utility （页面存档备份，存于互联网档案馆）——log4j在PL/SQL下的一种实现。 Log4db2 （页面存档备份，存于互联网档案馆）——一个为使用SQL命令和SQL PL代码的DB2 LUW的日志记录工具 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可以写每秒超过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）.  Release 2.24.0. 2024年9月6日 [2024年9月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.  缺少或|url=为空 (帮助); 使用|accessdate=需要含有|url= (帮助); 外部链接存在于|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  自由软件主题 Java主题 Chainsaw（英语：Chainsaw (log file viewer)） Log4Shell——2021年Log4j 2.0发现的最严重的漏洞 log4j官方主页 （页面存档备份，存于互联网档案馆）