Я использую 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спросил