【问题标题】:How to load application.properties into Log4j2 LogEventPatternConverter class?如何将 application.properties 加载到 Log4j2 LogEventPatternConverter 类中?
【发布时间】:2021-05-08 09:25:34
【问题描述】:

我正在处理一项任务,我想使用 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-boot logging log4j2 properties-file


    【解决方案1】:

    问题在于 SensitiveDataLog 是通过静态方法 newInstance() 创建的。显然,此时字段 ssn 并未初始化。您可以做的是稍后初始化该字段,例如刷新 Spring 上下文时。 这是我的sn-p:

    private static XmlMaskPatternConverter INSTANCE = new XmlMaskPatternConverter();
    
    public XmlMaskPatternConverter() {
        super(NAME, NAME);
    }
    
    public static XmlMaskPatternConverter newInstance() {
        return INSTANCE;
    }
    

    现在您可以在 Spring 配置中的某处调用静态方法 getInstance()(我在 @Bean 方法中执行此操作)并在那里设置 ssn 值。 Ofc,您需要为此字段创建一个 setter。

    附:希望能帮助到你。我也遇到了这个问题,所以决定把我的解决方案留在这里。我在 SO btw 上的第一篇文章)

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 1970-01-01
      • 2017-01-26
      • 2021-12-10
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多