Apache Log4j 2

Apache Log4j 2 是 Log4j 的升级版,对 Log4j 的前身 Log4j 1.x 进行了重大改进,并提供了 Logback 中可用的许多改进,同时解决了 Logback 体系结构中的一些固有问题。

Features

API Separation

Log4j 的 API 与实现是分开的,从而使应用程序开发人员可以清楚地知道他们可以使用哪些类和方法,同时确保向前的兼容性。这允许 Log4j 团队以兼容的方式安全地改进实施。

Log4j API 是一个日志外观,可以与 Log4j 实现一起使用,但是也可以在其他日志实现(例如 Logback)之前使用。与 SLF4J 相比,Log4j API 有几个优点:1. Log4j API 支持记录Messages而不是仅记录字符串。 2. Log4j API 支持 lambda 表达式。 3.与 SLF4J 相比,Log4j API 提供了更多的日志记录方法。 4.除了 SLF4J 支持的“参数化日志记录”格式外,Log4j API 还支持使用 java.text.MessageFormat 语法以及 printf 样式消息的事件。 5. Log4j API 提供了 LogManager.shutdown()方法。基础的日志记录实现必须实现 Terminable 接口,该方法才能生效。 6.完全支持标记,日志级别和 ThreadContext(aka MDC)之类的其他构造。

Improved Performance

Log4j 2 包含基于 LMAX Disruptor 库的下一代异步 Logger。在多线程方案中,与 Log4j 1.x 和 Logback 相比,异步 Logger 的吞吐量高 18 倍,延迟降低了几个数量级。有关详情,请参见异步记录性能。否则,Log4j 2 明显优于 Log4j 1.x,Logback 和 java.util.logging,尤其是在多线程应用程序中。有关更多信息,请参见Performance

支持多种 API

Log4j 2 API 将提供最佳性能,而 Log4j 2 提供对 Log4j 1.2,SLF4J,Commons Logging 和 java.util.logging(JUL)API 的支持。

Avoid lock-in

编码为 Log4j 2 API 的应用程序始终可以选择使用任何 SLF4J 兼容库作为其 Log4j-to-slf4j 适配器的 Logger 实现。

自动重载配置

与 Logback 一样,Log4j 2 可以在修改后自动重新加载其配置。与 Logback 不同,它在进行重新配置时不会丢失日志事件。

Advanced Filtering

与 Logback 一样,Log4j 2 支持基于上下文数据,标记,正则表达式和 Log 事件中的其他组件进行过滤。可以指定过滤,以将其应用于所有事件,然后再传递给 Logger 或当事件通过 Appender 时。此外,过滤器还可以与 Loggers 关联。与 Logback 不同,您可以在任何这些情况下使用通用的 Filter 类。

Plugin Architecture

Log4j 使用插件模式来配置组件。这样,您无需编写代码即可创建和配置 Appender,Layout,Pattern Converter 等。 Log4j 自动识别插件,并在配置引用它们时使用它们。

Property Support

您可以在配置中引用属性,Log4j 将直接替换它们,或者 Log4j 将它们传递给将动态解析它们的基础组件。属性来自配置文件中定义的值,系统属性,环境变量,ThreadContextMap 以及事件中存在的数据。用户可以通过添加自己的Lookup插件进一步自定义属性提供程序。

Java 8 Lambda 支持

以前,如果构建日志消息的成本很高,则通常会在构建消息之前显式检查是否启用了请求的日志级别。在 Java 8 上运行的 Client 端代码可以受益于 Log4j 的lambda support。如果未启用请求的日志级别,由于 Log4j 不会评估 lambda 表达式,因此可以用更少的代码获得相同的效果。

自定义日志级别

在 Log4j 2 中,可以轻松地在代码或配置中定义自定义日志级别。不需要子类。

Log Builder API

除了使用 Log4j API 中的许多日志方法之一之外,还可以使用构建器来构造日志事件。有关更多信息,请参见[Log Builder] [manual/logbuilder.html]。

Garbage-free

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

与应用程序服务器集成

版本 2.10.0 添加了模块 log4j-appserver 来改善与 Apache Tomcat 和 Eclipse Jetty 的集成。

Cloud Enabled

版本 2.12.0 引入了对通过查找访问 Docker 容器信息以及通过 Spring Cloud Configuration 访问和更新 Log4j 配置的支持。此支持在 2.13.0 版中得到了增强,以增加对访问 Spring Boot 属性以及 Kubernetes 信息的支持。有关详情,请参见登录云

与 Log4j 1.x 兼容

Log4j 2 的 Log4j-1.2-api 模块为使用 Log4j 1 日志记录方法的应用程序提供了兼容性。从 Log4j 2.13.0 开始,Log4j 2 还提供了对 Log4j 1.x 配置文件的实验支持。有关更多信息,请参见Log4j 2 与 Log4j 1 的兼容性

Documentation

《 Log4j 2 用户指南》可在此site或作为可下载的PDF获得。

Requirements

Log4j 2.13.0 及更高版本需要 Java8.版本 2.4 至 2.12.1 需要 Java 7,版本 2.0-alpha1 至 2.3 必须 Java 6.这些功能的文档指定了相关性。

News

Log4j 2.13.3 现已投入生产。 Log4j 2 的 API 与 Log4j 1.x 不兼容,但是可以使用适配器来允许应用程序 continue 使用 Log4j 1.x API。适配器也可用于 Apache Commons Logging,SLF4J 和 java.util.logging。

Log4j 2.13.3 是 Log4j 的最新版本。从 Log4j 2.13.0 开始,Log4j 2 在运行时需要 Java 8 或更高版本。此版本包含新功能和修补程序,可以在最新的changes report中找到。

请注意,在 Log4j 2.6 发行之后,由于在 Logger 接口中添加了新方法,因此发现与先前发行版存在较小的源不兼容性。如果您有执行此操作的代码:

logger.error(null, "This is the log message", throwable);

或类似的任何日志级别,您将得到一个编译器错误,指出引用不明确。要更正此问题,请执行以下操作:

logger.error("This is the log message", throwable);

or

logger.error((Marker) null, "This is the log message", throwable);

Log4j 2.13.3 保持与以前版本的二进制兼容性。