Конфигурация возврата для маскировки определенных данных журнала

У меня есть веб-приложение Spring Boot, и я использую логбэк в качестве решения для ведения журнала. Я просматривал документацию и не могу найти простой или «правильный» способ замаскировать личные / конкретные данные (личные данные, номера кредитных карт и т. д.).

Ближайшее, что мне удалось найти, - это фильтры Logback, однако вариант использования вокруг них, похоже, больше касается исключения журналов, соответствующих определенным критериям, я просто хочу замаскировать все журналы в масштабе приложения.

Это кажется таким простым вопросом, и я уверен, что мне не хватает чего-то супер простого, но мы очень ценим любой толчок или указание в правильном направлении.

Я также не заблокирован для входа в систему, поэтому, если есть более простой / лучший способ сделать это, например, с помощью log4j2, я все уши

Связанный: stackoverflow.com/questions/25277930/…

nickb 29.05.2018 03:24

Спасибо, это очень помогло.

yoplay two 29.05.2018 03:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
2 682
1

Ответы 1

Чтобы замаскировать настраиваемые поля, вам необходимо создать MaskingPatternLayout, как показано ниже,

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent;

public class MaskingPatternLayout extends PatternLayout {

  private String patternsProperty;
  private Optional<Pattern> pattern;

  public String getPatternsProperty() {
    return patternsProperty;
  }

  public void setPatternsProperty(String patternsProperty) {
    this.patternsProperty = patternsProperty;
    if (this.patternsProperty != null) {
      this.pattern = Optional.of(Pattern.compile(patternsProperty, Pattern.MULTILINE));
    } else {
      this.pattern = Optional.empty();
    }
  }

  @Override
  public String doLayout(ILoggingEvent event) {
    final StringBuilder message = new StringBuilder(super.doLayout(event));

    if (pattern.isPresent()) {
      Matcher matcher = pattern.get().matcher(message);
      while (matcher.find()) {

        int group = 1;
        while (group <= matcher.groupCount()) {
          if (matcher.group(group) != null) {
            final int startGrpIndex = matcher.start(group);
            final int endGrpIndex = matcher.end(group);
            final int diff = endGrpIndex - startGrpIndex + 1;
            int startIndex = startGrpIndex + diff;
            final int endIndex1 = message.indexOf(",", startIndex);
            final int endIndex2 = message.indexOf(" ", startIndex);
            final int endIndex3 = message.indexOf(")", startIndex);
            final int endIndex4 = message.indexOf("\n", startIndex);

            final Integer endIndex = getSmallestInt(
              Arrays.asList(Integer.valueOf(endIndex1), Integer.valueOf(endIndex2), Integer.valueOf(endIndex3), Integer.valueOf(endIndex4)));
            if (endIndex == null || endIndex <= 0) {
              continue;
            }

            for (int i = startIndex; i < endIndex; i++) {
              message.setCharAt(i, '*');
            }
          }
          group++;
        }
      }
    }
    return message.toString();
  }

  private Integer getSmallestInt(List<Integer> integerList) {

    return integerList.stream().filter(integer -> integer > 0).reduce((x, y) -> x < y ? x : y).get();
  }

}

Необходимо добавить кодировщик в приложениях logback.xml -

<encoder class = "ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class = "com.adgiants.config.MaskingPatternLayout">
        <patternsProperty>(password)|(email)</patternsProperty>
        <pattern>%d [%thread] %-5level %logger{35} - %msg%n</pattern>
      </layout>
</encoder>

Эта конфигурация просканирует все ваши операторы журнала и найдет такие слова, как «пароль» или «электронная почта» (в зависимости от того, что вы настроили в кодировщике logback.xml), его значения будут заменены на ****

Например

log.info("Received sign-up request, password=DummyPassword@123");

В журналах вышеуказанный оператор будет отображаться как,

Received sign-up request, password=*****************

как насчет маскировки объекта, имеющего массивы? companyName = тестовая частная компания, eventType = new, loginIds = [1334566, 795455, 4549554],

Chandresh Mishra 11.02.2021 16:10

Другие вопросы по теме