spring-boot - 如何将 application.properties 加载到 Log4j2 LogEventPatternConverter 类中?
问题描述
我正在处理一项我想使用 Log4j2 LogEventPatternConverter 类屏蔽敏感数据的任务。
@Plugin(name="SensitiveDataLog", category = "Converter")
@ConverterKeys({"sense"})
public class SensitiveDataLog extends LogEventPatternConverter {
@Value("${ssn}")
private String ssn;
public SensitiveDataLog(String name, String style) {
super(name, style);
}
public static SensitiveDataLog newInstance(String[] options) {
return new SensitiveDataLog("sense","sense");
}
@Override
public void format(LogEvent logEvent, StringBuilder outputMsg) {
String message = logEvent.getMessage().getFormattedMessage();
Matcher matcher = SSN_PATTERN.matcher(message);
if (matcher.find()) {
String maskedMessage = matcher.replaceAll("***-**-****");
outputMsg.append(maskedMessage);
} else {
outputMsg.append(message);
}
}
}
假设我想保留模式application.properties
,但这里的问题是我们无法加载属性值ssn
。始终为空。
这是我的 log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" monitorInterval="30"
packages="com.virtusa.xlab.fw.logging.component"
xmlns="http://logging.apache.org/log4j/2.0/config">
<Properties>
<Property name="basePath">logs/log4j2</Property>
</Properties>
<Appenders>
<!-- File Appender -->
<RollingFile name="FILE"
fileName="${basePath}/logfile.log" filePattern="${basePath}/logfile.%d{yyyy-MM-dd}-%i.log" append="true">
<PatternLayout
pattern="%-5p | %d{yyyy-MM-dd HH:mm:ss} | [%t] %C{2} (%F:%L) - %sense%n" />
<Policies>
<SizeBasedTriggeringPolicy size="1 KB" />
</Policies>
<DefaultRolloverStrategy max="4" />
</RollingFile>
<!-- Console Appender -->
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout
pattern="%-5p | %d{yyyy-MM-dd HH:mm:ss} | [%t] %C{2} (%F:%L) - %sense%n" />
</Console>
</Appenders>
<Loggers>
<Logger name="com.virtusa.xlab.fw" level="info" />
<Root level="info">
<AppenderRef ref="STDOUT" />
<AppenderRef ref="FILE" />
</Root>
</Loggers>
</Configuration>
有谁可以帮我离开这里吗?
谢谢。
解决方案
问题是SensitiveDataLog是通过静态方法newInstance()创建的。显然,此时字段 ssn 并未初始化。您可以做的是稍后初始化该字段,例如在刷新 Spring 上下文时。这是我的片段:
private static XmlMaskPatternConverter INSTANCE = new XmlMaskPatternConverter();
public XmlMaskPatternConverter() {
super(NAME, NAME);
}
public static XmlMaskPatternConverter newInstance() {
return INSTANCE;
}
现在您可以在 Spring 配置中的某处调用静态方法getInstance()(我在 @Bean 方法中执行此操作)并在那里设置ssn值。Ofc,您需要为此字段创建一个设置器。
PS希望它有所帮助。我也遇到了这个问题,所以决定把我的解决方案留在这里。我在 SO btw 上的第一篇文章)
推荐阅读
- python - Python 键值错误 (Json)
- chart.js - Chartjs 工具提示在调用 Chart.update 时消失
- android - 插入到 SQLite android 不起作用
- reactjs - Express / NextJS - 单个快速路由中的多个目录
- xamarin - 使用 MvvmCross 处理 CancellationToken 激活的 ViewModel 销毁的最佳方法是什么?
- python - Keras 和 Conv1D 问题的输入形状
- python - 脚本中的 Box API OAuth2.0
- visual-studio-code - Visual Studio 代码更改 cli 路径
- reactjs - 反应路由器路径和嵌套路径不起作用
- vim - pylint 的最大行长问题