diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml index c11f20955b..6d32025d94 100644 --- a/logging-modules/logback/pom.xml +++ b/logging-modules/logback/pom.xml @@ -15,6 +15,11 @@ + + org.json + json + 20180130 + ch.qos.logback logback-classic diff --git a/logging-modules/logback/src/main/java/com/baeldung/logback/MaskingPatternLayout.java b/logging-modules/logback/src/main/java/com/baeldung/logback/MaskingPatternLayout.java new file mode 100644 index 0000000000..04321e9066 --- /dev/null +++ b/logging-modules/logback/src/main/java/com/baeldung/logback/MaskingPatternLayout.java @@ -0,0 +1,46 @@ +package com.baeldung.logback; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import ch.qos.logback.classic.PatternLayout; +import ch.qos.logback.classic.spi.ILoggingEvent; + +public class MaskingPatternLayout extends PatternLayout { + + private Pattern multilinePattern; + private List maskPatterns = new ArrayList<>(); + + // invoked for every single entry in the xml + public void addMaskPattern(String maskPattern) { + maskPatterns.add(maskPattern); + multilinePattern = Pattern.compile(maskPatterns.stream().collect(Collectors.joining("|")), Pattern.MULTILINE); + } + + @Override + public String doLayout(ILoggingEvent event) { + return maskMessage(super.doLayout(event)); + } + + private String maskMessage(String message) { + if (multilinePattern == null) { + return message; + } + StringBuilder sb = new StringBuilder(message); + Matcher matcher = multilinePattern.matcher(sb); + while (matcher.find()) { + IntStream.rangeClosed(1, matcher.groupCount()).forEach(group -> { + if (matcher.group(group) != null) { + // replace each character with asterisk + IntStream.range(matcher.start(group), matcher.end(group)).forEach(i -> sb.setCharAt(i, '*')); + } + }); + } + return sb.toString(); + } + +} \ No newline at end of file diff --git a/logging-modules/logback/src/main/java/com/baeldung/logback/MaskingPatternLayoutExample.java b/logging-modules/logback/src/main/java/com/baeldung/logback/MaskingPatternLayoutExample.java new file mode 100644 index 0000000000..cbcd0209ab --- /dev/null +++ b/logging-modules/logback/src/main/java/com/baeldung/logback/MaskingPatternLayoutExample.java @@ -0,0 +1,27 @@ +package com.baeldung.logback; + +import java.util.HashMap; +import java.util.Map; + +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MaskingPatternLayoutExample { + + private static final Logger logger = LoggerFactory.getLogger(MaskingPatternLayoutExample.class); + + public static void main(String[] args) { + Map user = new HashMap(); + user.put("user_id", "87656"); + user.put("SSN", "786445563"); + user.put("address", "22 Street"); + user.put("city", "Chicago"); + user.put("Country", "U.S."); + user.put("ip_address", "192.168.1.1"); + user.put("email_id", "spring@baeldung.com"); + JSONObject userDetails = new JSONObject(user); + + logger.info("MaskingPatternExample log from {}" + userDetails, MaskingPatternLayoutExample.class.getSimpleName()); + } +} diff --git a/logging-modules/logback/src/main/resources/logback.xml b/logging-modules/logback/src/main/resources/logback.xml index 76ddc2e3ee..2d56c110e0 100644 --- a/logging-modules/logback/src/main/resources/logback.xml +++ b/logging-modules/logback/src/main/resources/logback.xml @@ -47,10 +47,23 @@ + + + + \"SSN\"\s*:\s*\"(.*?)\" + \"address\"\s*:\s*\"(.*?)\" + (\d+\.\d+\.\d+\.\d+) + (\w+@\w+\.\w+) + %-5p [%d{ISO8601,UTC}] [%thread] %c: %m%n%rootException + + + + + \ No newline at end of file