欢迎使用 Log4j 2!

Introduction

几乎每个大型应用程序都包含其自己的日志记录或跟踪 API。根据此规则,E.U。 SEMPER项目决定编写自己的跟踪 API。这是在 1996 年初。经过无数次增强,经过多次改进和大量工作之后,API 演变成了 log4j,这是 Java 的流行日志记录程序包。该软件包是根据open source计划认证的成熟的开源许可证Apache 软件许可分发的。 http://logging.apache.org/log4j/2.x/index.html可以找到最新的 log4j 版本,包括完整的源代码,类文件和文档。

将日志语句插入代码是调试它的低技术方法。这也可能是唯一的方法,因为调试器并不总是可用或不适用。对于多线程应用程序和整个分布式应用程序通常是这种情况。

经验表明,日志记录是开发周期的重要组成部分。它具有几个优点。它提供有关应用程序运行的精确上下文。一旦插入到代码中,日志输出的生成无需人工干预。此外,日志输出可以保存在永久性介质中,以便以后进行研究。除了在开发周期中使用它外,足够丰富的日志记录包也可以视为审核工具。

正如 Brian W. Kernighan 和 Rob Pike 在其 true 出色的著作“编程实践”中所说的那样:

作为个人选择,我们倾向于不使用调试器,而不必获取堆栈跟踪或一个或两个变量的值。原因之一是很容易在复杂的数据结构和控制流的细节上迷失方向。我们发现单步执行程序的效率不如认真思考,并在关键位置添加输出语句和自检代码。单击结束语句所花费的时间比扫描明智放置的显示器的输出所花费的时间更长。即使单步进入代码的关键部分,也可以花更少的时间来决定将打印语句放置在哪里,即使假设我们知道在哪里也可以。更重要的是,调试语句保留在程序中。调试会话是短暂的。

日志记录确实有其缺点。它可能会使应用程序变慢。如果太冗长,则可能导致滚动失明。为了减轻这些担忧,log4j 被设计为可靠,快速和可扩展的。由于日志记录很少是应用程序的主要重点,因此 log4j API 努力使之易于理解和使用。

Log4j 2

Log4j 1.x 已被广泛采用并在许多应用程序中使用。但是,经过多年的 Developing,它已经放慢了脚步。由于它需要与非常旧的 Java 版本兼容,因此维护变得更加困难,并于 2015 年 8 月成为生命的尽头。它的替代产品 SLF4J/Logback 对框架进行了许多必要的改进。那么,为什么还要麻烦 Log4j 2?以下是一些原因。

  • Log4j 2 设计为可用作审核日志记录框架。重新配置时,Log4j 1.x 和 Logback 都将丢失事件。 Log4j 2 不会。在 Logback 中,Appender 中的异常永远不会对应用程序可见。在 Log4j 2 中,可以将 Appender 配置为允许异常渗透到应用程序中。

  • Log4j 2 包含基于LMAX Disruptor 库的下一代Asynchronous Loggers。在多线程方案中,与 Log4j 1.x 和 Logback 相比,异步 Logger 的吞吐量高 10 倍,延迟降低了几个数量级。

  • Log4j 2 对于独立应用程序是garbage free,对于稳态记录期间的 Web 应用程序则是低垃圾。这样可以减少垃圾收集器上的压力,并可以提供更好的响应时间性能。

  • Log4j 2 使用Plugin system,通过添加新的AppendersFiltersLayoutsLookups和模式转换器,使扩展框架非常容易,而无需对 Log4j 进行任何更改。

  • 由于插件系统的配置比较简单。配置中的条目不需要指定类名。

  • 支持自定义日志级别。自定义日志级别可以在代码或配置中定义。

  • 支持lambda expressions。只有在启用了请求的日志级别的情况下,在 Java 8 上运行的 Client 端代码才可以使用 lambda 表达式来延迟构造日志消息。不需要显式级别检查,从而使代码更简洁。

  • 支持Message objects。消息允许对有趣和复杂的结构的支持通过日志系统传递并得到有效的操纵。用户可以自由创建自己的Message类型,并编写自定义LayoutsFiltersLookups进行操作。

  • Log4j 1.x 支持 Appender 上的过滤器。 Logback 添加了 TurboFilter,以允许在 Logger 处理事件之前对其进行过滤。 Log4j 2 支持过滤器,这些过滤器可以配置为在由 Logger 处理或在附加器上处理事件之前,由 Logger 处理事件。

  • 许多 Logback Appender 都不接受布局,只会发送固定格式的数据。大多数 Log4j 2 Appender 都接受布局,从而允许以所需的任何格式传输数据。

  • Log4j 1.x 和 Logback 中的布局返回一个字符串。这导致了在Logback Encoders处讨论的问题。 Log4j 2 采用了更简单的方法,即Layouts始终返回字节数组。这样做的好处是,它们实际上可以在任何 Appender 中使用,而不仅仅是在写到 OutputStream 的 Appender 中使用。

  • Syslog Appender支持 TCP 和 UDP 以及 BSD syslog 和RFC 5424格式。

  • Log4j 2 充分利用了 Java 5 并发支持,并以最低的级别执行锁定。 Log4j 1.x 已知死锁问题。其中许多已在 Logback 中修复,但许多 Logback 类仍需要较高级别的同步。

  • 它是遵循所有 ASF 项目使用的社区和支持模型的 Apache Software Foundation 项目。如果您想贡献或获得提交更改的权利,请遵循Contributing概述的路径。