前言
本文是自学log4j2 ,参考阿帕奇官网,对log4j2 的官方文档翻译
Apache Log4j 2
Apache Log4j 2 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了重大改进,并提供了许多 Logback 中可用的改进,同时修复了 Logback 架构中的一些固有问题。
重要:安全漏洞 CVE-2021-44832
摘要:当攻击者控制配置时,Apache Log4j2 通过 JDBC Appender 容易受到 RCE 的攻击。
细节
Apache Log4j2 版本 2.0-beta7 到 2.17.0(不包括安全修复版本 2.3.2 和 2.12.4)容易受到远程代码执行 (RCE) 攻击,其中有权修改日志配置文件的攻击者可以构建恶意配置 将 JDBC Appender 与引用 JNDI URI 的数据源一起使用,该 JNDI URI 可以执行远程代码。 此问题已通过将 JNDI 数据源名称限制为 Log4j2 版本 2.17.1、2.12.4 和 2.3.2 中的 java 协议来解决。
减轻
升级到 Log4j 2.3.2(适用于 Java 6)、
2.12.4(适用于 Java 7)
或 2.17.1(适用于 Java 8 及更高版本)
参考
有关旧版本 Log4j 的详细信息和缓解措施,请参阅安全页面。
重要提示:安全漏洞 CVE-2021-45105、CVE-2021-45046 和 CVE-2021-44228
有关这些安全问题的详细信息和缓解措施,请参阅安全页面。
特征
API 与实现分离
Log4j 的 API 与实现分开,使应用程序开发人员清楚他们可以使用哪些类和方法,同时确保向前兼容性。这允许 Log4j 团队以安全且兼容的方式改进实现。 Log4j API 是一个日志外观,当然可以与 Log4j 实现一起使用,但也可以在其他日志实现(例如 Logback)之前使用。与 SLF4J 相比,Log4j API 有几个优点:
- Log4j API 支持记录消息而不仅仅是字符串。
- Log4j API 支持 lambda 表达式。
- Log4j API 提供了比 SLF4J 多得多的日志记录方法。
- 除了 SLF4J 支持的“参数化日志”格式之外,Log4j API 还支持使用 java.text.MessageFormat 语法的事件以及 printf 样式的消息。
- Log4j API 提供了一个 LogManager.shutdown() 方法。底层日志实现必须实现 Terminable 接口才能使方法生效。
- 完全支持其他构造,例如标记、日志级别和 ThreadContext(又名 MDC)。
改进的性能
Log4j 2 包含基于 LMAX Disruptor 库的下一代异步记录器。 在多线程场景中,异步 Logger 的吞吐量比 Log4j 1.x 和 Logback 高 18 倍,延迟低几个数量级。 有关详细信息,请参阅异步日志记录性能。 除以以外,Log4j 2 明显优于 Log4j 1.x、Logback 和 java.util.logging,尤其是在多线程应用程序中。 有关详细信息,请参阅性能。
支持多种 API
在Log4j 2 API 提供最佳性能的同时,还提供了对 Log4j 1.2、SLF4J、Commons Logging 和 java.util.logging (JUL) API 的支持。
避免强绑定
编码到 Log4j 2 API 的应用程序始终可以选择使用任何符合 SLF4J 的库作为它们的记录器实现和 log4j-to-slf4j 适配器。
自动重新加载配置
与 Logback 一样是,Log4j 2 也支持修改时自动重新加载其配置。
与 Logback 不同的是,它不会在重新配置发生时丢失日志事件。
高级过滤
与 Logback 一样,Log4j 2 支持基于 Log 事件中的上下文数据、标记、正则表达式和其他组件进行过滤。 在传递给记录器之前或通过附加器时,可以指定过滤以应用于所有事件。 此外,过滤器还可以与记录器相关联。 与 Logback 不同,您可以在任何这些情况下使用公共 Filter 类。
插件架构
Log4j 使用插件模式来配置组件。 因此,您无需编写代码来创建和配置 Appender、布局、模式转换器等。 Log4j 会自动识别插件并在配置引用它们时使用它们。
属性支持
您可以在配置中引用属性,Log4j 将直接替换它们,或者 Log4j 将它们传递给将动态解析它们的底层组件。 属性来自配置文件中定义的值、系统属性、环境变量、ThreadContext Map 和事件中存在的数据。 用户可以通过添加自己的查找插件来进一步自定义属性提供程序。
Java 8 Lambda 支持
以前,如果构建日志消息的成本很高,您通常会在构建消息之前明确检查请求的日志级别是否已启用。 在 Java 8 上运行的客户端代码可以从 Log4j 的 lambda 支持中受益。 由于如果未启用请求的日志级别,Log4j 将不会评估 lambda 表达式,因此可以用更少的代码实现相同的效果。
自定义日志级别
在 Log4j 2 中,可以在代码或配置中轻松定义自定义日志级别。 不需要子类化。
日志生成器 API
除了使用 Log4j API 中的众多日志方法之一,还可以使用构建器构建日志事件。 有关详细信息,请参阅 [日志生成器][manual/logbuilder.html]。
无垃圾
在稳态日志记录期间,Log4j 2 在独立应用程序中是无垃圾的,而在 Web 应用程序中则是低垃圾。 这减少了垃圾收集器的压力并且可以提供更好的响应时间性能。
与应用服务器集成
版本 2.10.0 添加了模块 log4j-appserver 以改进与 Apache Tomcat 和 Eclipse Jetty 的集成。
启用云
2.12.0 版本引入了对通过 Lookup 访问 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 的兼容性。
文档
Log4j 2 用户指南可在此站点上获得或作为可下载的 PDF 获得。
要求
Log4j 2.13.0 及更高版本需要 Java 8。2.4 到 2.12.1 版本需要 Java 7(Log4j 团队不再支持 Java 7)。 某些功能需要可选的依赖项; 这些功能的文档将指定所需的依赖项。
消息
Log4j 2.17.1 已经发布到:
地址 CVE-2021-44832。 其他小错误修复。 2.17.1(对于 Java 8)是推荐的升级。
Log4j 2.17.1 现在可用于生产。 Log4j 2 的 API 与 Log4j 1.x 不兼容,但是可以使用适配器来允许应用程序继续使用 Log4j 1.x API。 适配器也可用于 Apache Commons Logging、SLF4J 和 java.util.logging。
Log4j 2.17.1 是 Log4j 的最新版本。 从 Log4j 2.13.0 开始,Log4j 2 在运行时需要 Java 8 或更高版本。 此版本包含可在最新更改报告中找到的新功能和修复程序。
Log4j 2.17.1 保持与以前版本的二进制兼容性。