Apache Log4j是一个基于Java的日志记录工具。它是由瑞士程式設計師Ceki Gülcü於2001年开发的,现在则是Apache软件基金会的一个项目。 Log4j是几种之一。
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 1的日志级别和消息,以严重性递减排序。左栏列出了log4j的日志级别定义,右列提供了每个日志级别的简要说明。
配置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 配置示例
TTCC
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版。
- [http://log4javascript.org/ log4javascript] ——JavaScript下的另一个移植。最新的版本为2014年5月发布的1.4.6版。
- [http://jsnlog.com/ JSNLog] ——JavaScript下的另一移植。在2014年7月,最新的版本为2.7.1,并且定期更新。
- [https://web.archive.org/web/20070301084859/http://logging.apache.org/log4net/ Apache Log4net]——微软.NET Framework下的移植。最新的版本为2013年发布的1.2.13。
- [http://mschilli.github.com/log4perl log4perl] ——log4j日志软件包在一个Perl下的移植。最新的版本为2014年5月发布的1.44。
- [https://web.archive.org/web/20130114155730/http://log4r.rubyforge.org/ log4r]——一个Ruby下的“移植”。
- [https://github.com/tmuth/Logger---A-PL-SQL-Logging-Utility PL-SQL-Logging-Utility] ——log4j在PL/SQL下的一种实现。
- [http://angoca.github.io/log4db2/ 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利用了[http://lmax-exchange.github.io/disruptor/ LMAX Disruptor] 。例如,在相同的环境下,Log4j 2可以写每秒超过18,000,000条信息,而其他框架(像Logback和Log4j 1)每秒只能写< 2,000,000条消息。
Log4j 2提供对SLF4J、Commons Logging、Apache Flume和Log4j 1的支持。
参考文献
延展阅读
*
*
参见
*
*Log4Shell——2021年Log4j 2.0发现的最严重的漏洞
外部链接
*[http://logging.apache.org/log4j/ log4j官方主页]
评论 (0)