민감한 개인 정보(이메일, 주민번호, 계좌번호 등)는 로그에서 마스킹 처리 해야 하는 경우가 있다.
로그 설정에서 손쉽게 마스킹 처리를 할 수 있다.

Logback

  • MaskingPatternLayout : 마스킹을 위한 레이아웃 클래스
    • logback.xml의 마스킹 패턴을 읽고 이를 로그 메시지에 적용
    • PatternLayout 상속
public class MaskingPatternLayout extends PatternLayout 
{
	private Pattern multilinePattern;
	private List<String> maskPatterns = new ArrayList<>();

	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) {
		//When masking is disabled in a environment
		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) {
					IntStream.range(matcher.start(group), 
								matcher.end(group)).forEach(i -> sb.setCharAt(i, '*'));
				}
			});
		}
		return sb.toString();
	}
}
  • logback.xml
<configuration>

  <appender name="mask" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="com.mypro.common.log.MaskingPatternLayout">
        <maskPattern>(01\d|02|0[3-9]\d|05\d\d)(-?)(\d{3,4})(-?)(\d{4})</maskPattern> <!-- Phone pattern -->
        <maskPattern>(\w+@\w+\.\w+)</maskPattern> <!-- Email pattern -->
        <pattern>%d{HH:mm:ss.SSS} [%thread] %replace([%X{CorrelationId}] ){'^\[\] $',''}%highlight(%-5level) %green(%logger{36}) - %msg%n</pattern>
      </layout>
    </encoder>
  </appender>

</configuration>

Logstash

  • 스테이징, 프로덕션 환경에서는 모니터링을 위해 로그를 데이터 파이프라인으로 보내야 되는데 이를 위해 사용된다
  • xml 설정만으로 가능
<configuration>

  <appender name="logstash" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
      <jsonGeneratorDecorator class="net.logstash.logback.mask.MaskingJsonGeneratorDecorator">
        <!-- Phone pattern -->
        <valueMask>
          <value>(01\d|02|0[3-9]\d|05\d\d)(-?)(\d{3,4})(-?)(\d{4})</value>
          <mask>$1****$5</mask>
        </valueMask>

        <!-- Email pattern -->
        <valueMask>
          <value>(\w)\w*@(\w*)\.(\w*)</value>
          <mask>$1****@$2.$3</mask>
        </valueMask>
      </jsonGeneratorDecorator>
    </encoder>
  </appender>

</configuration>