Проблема с маскировкой данных. Элемент пакета в конфигурации log4j2.xml работает в Windows, но не распознается в CentOs (Linux) - PullRequest
0 голосов
/ 21 октября 2019

Я использую org.apache.logging.log4j.core.pattern.LogEventPatternConverter для сканирования и маскирования любого номера CC перед печатью в консоли. В windows тег 'package' в файле log4j2.xml сканирует указанный пакет для реализации логики маскирования и правильно маскирует журналы с указанным шаблоном. Но в centOs (Linux) тег пакета не работает и маскирование не выполняется. Я не могу найти проблему, которая не позволяет CentOS определить элемент пакета. Мне нужна маскирующая логика, чтобы она нормально работала и в CentO.

Я пробовал разные пользовательские ключи, такие как "% k", "% spi" и т. Д. Также пытался указать ключ маскирования в качестве свойства и использовать его. Но ключ по-прежнему печатается, а не маскируется. Я читал, что у log4j2 есть проблемы с восприятием элемента пакета в версии 2.0-rc2, 2.0, но его говорят, что он решен в версии 2.0.1. Ссылка на трек Jira: https://issues.apache.org/jira/browse/LOG4J2-741

Но я думаю, что эта версия не будет проблемой для меня, так как она отлично работает в Windows!

См. Приложенные ниже журналы вывода, в которых я назвал пользовательский ключ как «% masked». Таким образом, в centOs рассматривается только% m (это зарезервированный ключ log4j для печати сообщения) и выводится оставшееся «ask» в виде itis вместо того, чтобы рассматривать всю строку «% masked» как пользовательский ключ

log4j2. xml:

<configuration
xmlns="http://logging.apache.org/log4j/2.0/config" status="OFF"
packages="packageNameofMaskingConvertor">
<Properties>
    <Property name="buildNumber">$${env:BUILD_NUMBER:-NA}</Property>
</Properties>
<Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
        <PatternLayout
            pattern="timestamp:'%d{yyyy-MM-dd HH:mm:ss.SSS}', severity:'%level', buildNumber: ${buildNumber} , message:'%masked'%n" />
    </Console>
</Appenders>
<loggers>
    <Logger name="myLoggername" level="INFO" />     
    <root level="WARN">
        <appender-ref ref="STDOUT"/>
    </root>
</loggers>
</configuration>    

Класс LogMaskingConverter:

@Plugin(name = "LogMaskingConverter", category = "Converter")
@ConverterKeys({ "masked" })
public class LogMaskingConverter extends LogEventPatternConverter {

protected LogMaskingConverter(String name, String style) {
    super(name, style); 
}

private static final String CREDIT_CARD_REGEX = "([0-9]{16})";
private static final Pattern CREDIT_CARD_PATTERN = Pattern.compile(CREDIT_CARD_REGEX);
private static final String CREDIT_CARD_REPLACEMENT_REGEX = "XXXXXXXXXXXXXXXX";

public static LogMaskingConverter newInstance(String[] options) {
    return new LogMaskingConverter("masked", Thread.currentThread().getName());
}

@Override
public void format(LogEvent event, StringBuilder outputMessage) {
    String message = event.getMessage().getFormattedMessage();
    String maskedMessage = message;
    try {
        maskedMessage = mask(message);
    } catch (Exception e) {         
        maskedMessage = message;
    }
    outputMessage.append(maskedMessage);

}

private String mask(String message) {
    Matcher matcher = null;
    StringBuffer buffer = new StringBuffer();

    matcher = CREDIT_CARD_PATTERN.matcher(message);
    while (matcher.find()) {
        matcher.appendReplacement(buffer, CREDIT_CARD_REPLACEMENT_REGEX);
    }
    matcher.appendTail(buffer);
    return buffer.toString();
}

}

Например, если сообщение журнала «Неверный номер кредитной карты 1234512345123456»,

Ожидаемый результат: Неверная кредитная картаномер XXXXXXXXXXXXXXXX

Фактический вывод при запуске приложения в Windows: Неверный номер кредитной карты XXXXXXXXXXXXXXXX

Фактический вывод в CentOs (linux): Неверный номер кредитной карты 1234512345123456спросил

...