JetBrains官方博客发文宣布 IntelliJ 平台将完全停止使用 Log4j,并切换到 java.util.logging 作为标准日志框架。
众所周知,之前在Log4j2中发现了一些漏洞,但是JetBrains官方表示基于IntelliJ平台的IDE使用了Log4j 1.2修补版本,不会受此漏洞的影响,同时删除了所有与网络相关的代码。Log4j 库的第 1 版和第 2 版是两个完全不同的代码库,具有不兼容的 API,版本迁移是一项艰巨的工作,不过,有一些自动化安全工具会把使用了旧版本的Log4j平台标记为存在安全问题。
IntelliJ平台对于日志框架的要求很低,可能需要的功能就是记录到文件和控制台,以及为代码库的不同部分配置日志级别的可能性。所有这些要求都包含在作为 JDK 一部分的标准日志 API(java.util.logging)中,为了避免错误的安全警报并减少潜在的攻击,IntelliJ 平台完全停止使用 Log4j 并切换到 java.util.logging 作为标准日志框架,更改将在版本 2022.1 中发布。
由于大量第三方插件(直接或间接)使用 Log4j,我们将发布 Log4j API 的存根实现,将日志输出重定向到 java.util.logging,此功能源自 SLF4J 项目。但是,存根并没有完全实现所有方法,因此为了保持插件的全部功能,开发者可能需要调整代码以适应新环境。
检查代码或依赖项是否使用 Log4j,并按照以下说明更新代码:
- 如果在代码中使用 Log4j,该代码同时用于插件和其他上下文:切换到使用 SLF4J API。IntelliJ 平台通过 java.util.logging 实现了 SLF4J API,因此该平台完全支持 SLF4J 日志记录。
- 如果代码依赖项中使用了 Log4j:请求依赖项维护者切换到 SLF4J。如果无法切换,由于 Log4j 到 SLF4J 的桥接,依赖项中的日志记录很可能会继续工作。
- 如果使用 Log4j API 自定义、SLF4J 依赖项的日志记录:切换到使用 java.util.logging API 来配置处理程序和日志级别。
- 如果使用 Log4j XML 文件在测试中配置日志记录:切换到使用 .properties 文件的配置,如LogManager 文档中所述。使用 IntelliJ 测试框架运行测试时,可以使用
idea.log.config.properties.file
系统属性传递日志属性文件的路径。
以上更改会在 221.4165.x EAP 版本中更新。