我有一个基于 Apache Storm 2.3 的应用程序。该应用程序还具有球衣依赖项,例如
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.29</version>
</dependency>
还有 1 个库依赖项(我们称之为 A),它本身也调用 jersey 客户端。
问题陈述: 我能够控制应用程序完成的日志记录,例如屏蔽敏感令牌。但是,log4j2.xml 中完成的屏蔽设置不会应用于 A 发出的调用,并且敏感信息会打印在日志中。
在调试时,它由 jersey-common-2.29.jar 中的 LoggingFeature 类打印。比如:
如何屏蔽该库调用打印的令牌。
完整流程为:
我调用库A的实用函数(传递令牌和其他信息作为参数)->库A进行http调用->令牌被打印。
我尝试了多种屏蔽技术,如下所述: https://alesaudate.medium.com/masking-sensitive-data-in-log4j-2-the-simplest-way-possible-2c2e74c17f2d或https://faceissuesonit.com/log4j2-how-to-mask -日志-个人机密-spi-信息/。
P.S -> 我无法更改日志记录库,因为它可能会影响当前的日志记录。
Log4j Core 仅当库实际使用它作为日志记录后端时才能屏蔽您的消息。
Jersey 使用
java.util.logging
作为日志记录 API(参见 源代码),这是最难重定向到非标准日志记录后端的。
为此,您需要在任何日志记录开始之前(这通常意味着在命令行上)将
java.util.logging.manager
Java 系统属性设置为不同的 LogManager
。
为了在 Apache Storm 发行版中执行此操作,您需要:
log4j-jul
添加到应用程序类路径(lib
发行版的子文件夹),storm-env.sh
目录中添加一个conf
文件,内容为:
export JAR_JVM_OPTS="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager"