首页 > 解决方案 > 如何将 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>

有谁可以帮我离开这里吗?

谢谢。

标签: spring-bootlogginglog4j2properties-file

解决方案


问题是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 上的第一篇文章)


推荐阅读