如何将 application.properties 加载到 Log4j2 LogEventPatternConverter class 中?

How to load application.properties into Log4j2 LogEventPatternConverter class?

我正在执行一项任务,我想使用 Log4j2 LogEventPatternConverter 屏蔽敏感数据 Class。

@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,你需要为这个字段创建一个setter。

P.S。希望能帮助到你。我也遇到了这个问题,所以决定把我的解决方案留在这里。我的第一个 post 关于 SO btw)