欢迎来到Log4j 2

原文地址

介绍

几乎每一个大型应用都包含自己的日志或追踪API,早在1996年,欧盟的SEMPER项目决定写一个自己的追踪API。在无数次提升改进后,在这个API上所做的大量工作促成它演变成了Log4j,一个流行的Java日志包。这个包遵照Apache软件许可证分发,这是一个由开源社区认证并倡议的成熟开源许可。Log4j的最新版本,包括所有的源代码、class文件和文档都可以在这里找到:http://logging.apache.org/log4j/2.x/index.html

在代码中插入日志语句是调试程序的一种技术含量较低的做法。但这可能也是唯一的方法,因为调试器并不总是可用或适用的,这是在大型多线程应用和分布式应用中的通常情况。

经验表明,日志记录是开发周期的一个重要组成部分。它有一些优点——提供关于应用程序的精确运行上下文信息。一旦插入到代码,记录的输出就不再需要人工干预。此外,日志输出可以保存到持久化的介质中,以便于稍后进行研究。除了在开发周期中使用外,丰富的日志记录包也可以被看作是一个审计工具。

正如Brian W. Kernighan和Rob Pike在他们杰出的著作《The Practice of Programming》中所说:

作为个人的选择,我们倾向于不使用调试器而获得一个堆栈追踪或一两个变量的值。原因之一是,调试很容易在复杂的数据结构和控制流程的细节中迷失;我们发现一步步地检查程序效率很低,不如在关键的地方好好想想,加入输出语句并自检代码来得好。

日志也有它的缺点,它可能让应用程序变慢。如果太详细,它可能导致滚动的内容太多而不可见。为了减轻这些影响,Log4j被设计为可靠、快速和可扩展的。要做到只记录应用程序很少的要点,Log4j的API正努力做到易用、好理解。

Log4j 2

Log4j的1.x版本已经被广泛使用于很多应用程序中。然而,它这些年的发展已经放缓。它变得越来越难以维护,因为它需要严格遵循很老的Java版本,并在2015年8月寿终正寝。它的替代品,SLF4J和Logback对框架做了很多必要的改进。那么为什么还要费心去做Log4j 2呢?几个原因如下:

  1. Log4j 2被设计为可以作为审计框架使用。Log4j 1.x和Logback都会在重新配置的时候失去事件,而Log4j 2不会。在Logback中,Appender当中的异常对应用从来都是不可见的。但Log4j 2的Appender可以设置为允许将异常渗透给应用程序。
  2. Log4j 2包含基于LMAX Disruptor库的下一代异步日志器。在多线程情况下,异步日志器具有比Log4j 1.x和Logback高出10倍的吞吐性能以及更低的延迟。
  3. Log4j 2在稳定记录状态下,对单机应用是无垃圾的,对Web应用是低垃圾的。这不仅降低了垃圾回收器的压力,还可以提供更好的响应性能。
  4. Log4j 2使用插件系统使得它非常容易通过新的AppenderFilterLayoutLookup和Pattern Converter来扩展框架,且不需要对Log4j做任何修改。
  5. 由于插件系统的配置更简单了,配置项不需要声明类名称。
  6. 支持自定义日志级别。自定义日志级别可以在代码或配置中定义。
  7. 支持Lambda表达式。运行在Java 8上的客户端代码可以使用Lambda表达式来实现仅在对应的日志级别启用时延迟构造日志消息。由于不需要明确地层层把关,这带来了更简洁的代码。
  8. 支持Message对象。Message允许支持感兴趣或复杂的结构体在日志系统中传输,且可以被高效地操作。用户可以自由地创建他们自己的Message类型,并编写自定义的LayoutFilterLookup来操作它们。
  9. Log4j 1.x支持Appender上的Filter。Logback引入了TurboFilter来在事件被Logger处理之前对它们进行过滤。Log4j 2支持的Filter可以设置为在被Logger接管之前即处理事件,如同它在Logger或Appender中被处理。
  10. 很多Logback的Appender不接受一个Layout,且只能发送固定格式的数据。而大多数Log4j 2的Appender接受Layout,允许数据以任意一种所需的格式传输。
  11. Log4j 1.x和Logback中的Layout返回一个String。这导致了在Logback Encoder中讨论的问题。Log4j 2用更简单的方法,Layout总是返回一个字节数组。优点是这意味着它们可以用于任何Appender,而不仅仅是写入到OutputStream中的那些。
  12. Syslog Appender既支持TCP也支持UDP,同样支持BSD系统日志以及RFC 5424格式。
  13. Log4j 2利用了Java 5的并发优势,并在尽可能最低的程度上进行锁定。Log4j 1.x中已知存在死锁问题。其中很多已经在Logback中修复,但很多Logback的class文件仍然需要在更高的编译级别中同步。
  14. 这是一个被所有ASF项目集体支持使用的Apache软件基金会项目。如果你想要贡献或修改,只要参照贡献中的方法。

results matching ""

    No results matching ""