package play.modules.logger; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.spi.ThrowableInformation; public class CardNumberFilteringLayout extends ExtendedPatternLayout { Obfuscator obfuscator = new Obfuscator(); @Override public String format(LoggingEvent event) { if (event.getMessage() instanceof String) { String message = event.getRenderedMessage(); String maskedMessage = obfuscator.maskCardNumber(message); if (!message.equals(maskedMessage)) { ThrowableInformation throwableInformation = event.getThrowableInformation(); Throwable throwable = throwableInformation != null ? throwableInformation.getThrowable() : null; LoggingEvent maskedEvent = new LoggingEvent(event.fqnOfCategoryClass, Logger.getLogger(event.getLoggerName()), event.timeStamp, event.getLevel(), maskedMessage, throwable); return superFormat(maskedEvent); } } return superFormat(event); } String superFormat(LoggingEvent maskedEvent) { return super.format(maskedEvent); } @Override protected RequestIdPatternConverter createRequestIdPatternConverter() { return new CardNumberAwareRequestIdPatternConverter(); } private static class CardNumberAwareRequestIdPatternConverter extends RequestIdPatternConverter { Obfuscator obfuscator = new Obfuscator(); @Override protected String currentThreadName() { return obfuscator.maskCardNumber(super.currentThreadName()); } } }