Как замаскировать значения System.out.println (CARD_NUMBER) в catalina.out - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу замаскировать значения System.out.println (CARD_NUMBER) в catalina.out

Я выполнил следующее кодирование ниже, и он работает нормально для ведения журнала, например, Log.info (CARD_NO) получаетмаскируется как XXXX, но тот же CARD_NO не маскируется, если он записан как System.out.println (CARD_NUMBER), вместо этого CARD_NO печатается в catalina.out

В некотором классе Test, например

Log.info (CARD_NO) ---> XXXX (замаскированная карточка №)

System.out.println (CARD_NO) ---> CARD_NO напечатано (без замаскированной карты нет)

В Log4j.xml

 <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="console" class="org.apache.log4j.ConsoleAppender">
            <param name="Target" value="System.out" />
            <layout class="com.test.soap.common.CustomFilteringLayout">
                <param name="ConversionPattern" value="%d{ISO8601} %-5p %c{1}.%M() %m%n" />
            </layout>
        </appender>

        <appender name="logfile" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="../logs/test.log" />    
            <layout class="com.test.soap.common.CustomFilteringLayout">
                <param name="ConversionPattern" value="%d{ISO8601}{CST} %p %t [%c] - %m%n" />
            </layout>
        </appender> 

       <root>
        <priority value="INFO" />
        <appender-ref ref="logfile" />    
        <appender-ref ref="console" />         
    </root>

</log4j:configuration>

CustomFilteringLayout class

public class CustomFilteringLayout extends EnhancedPatternLayout {
    /**
     * Any number that's of 10 digit would be masked (e.g: cardId). If number is > 11 digit then first 12 digit would masked.
     * This is so because of keeping it in mind that cardNumber's length is 16 digit so first 12 digit would be masked.
     * 
     * @param LoggingEvent event
     * @return String formated String
     */

    @Override
    public String format(LoggingEvent event) {

        if (event.getMessage() instanceof String) {
            String message = event.getRenderedMessage();

            Matcher matcher = RemoteConstants.PATTERN.matcher(message);
            if (matcher.find()) {

                String maskedMessage ="";
                if(StringUtils.isNotBlank(matcher.group(1))&& matcher.group(1).length()==RemoteConstants.CARD_NUMBER_LENGTH){
                    StringBuffer masked = new StringBuffer();

                    masked.append(matcher.group(1).substring(0, 4)).append(" ");
                    masked.append(matcher.group(1).substring(4, 6)).append("XX ");
                    masked.append("XXXX ").append(matcher.group(1).substring(12, 16));

                    maskedMessage=masked.toString();
                }else{
                    maskedMessage = matcher.replaceAll(RemoteConstants.MASK);
                }

                Throwable throwable = event.getThrowableInformation() != null ? event.getThrowableInformation()
                        .getThrowable() : null;
                LoggingEvent maskedEvent = new LoggingEvent(event.fqnOfCategoryClass, Logger.getLogger(event
                        .getLoggerName()), event.timeStamp, event.getLevel(), maskedMessage, throwable);
                return super.format(maskedEvent);
            }
        }

        return super.format(event);
    }
}

1 Ответ

0 голосов
/ 20 февраля 2019

Имеете ли вы какие-либо намерения удалить все вызовы System.out.println или заменить их вызовами в Logger?

В противном случае, если вы действительно не можете исправить исходный код,Вы думали о переопределении System.out с помощью System.setOut?Вы можете установить печать, которая обнаружит, что входная строка является номером карты, и замаскировать ее - печатая остальную часть нормально ...?

Что-то вроде:

PrintStream underlyingOut = System.out;
System.setOut(new PrintStream(underlyingOut) {
    @Override
    public void println(String x) {
        if(x.matches("[0-9\\-]+")) {
            super.println(x.replaceAll("[0-9]", "X"));
        } else {
            super.println(x);
        }
    }
});

System.out.println("Hello");
System.out.println("123-4567-89");

Это замедлит работу системы.out.println вызывает, но выводит:

Hello
XXX-XXXX-XX

HTH!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...