当前位置: 首页 > 知识库问答 >
问题:

用于屏蔽特定日志数据的回退配置

康言
2023-03-14

我有一个Spring Boot web应用程序,正在使用logback作为我的日志解决方案。我一直在查看文档,找不到一种简单或“正确”的方法来掩盖私人/特定数据(个人信息、信用卡等)。

我能找到的最接近的是Logback过滤器,然而,围绕这些过滤器的用例似乎更多地是关于省略符合特定标准的日志,我只是想屏蔽所有应用程序范围的日志。

这似乎是一个如此基本的问题,我确信我错过了一些超级基本的东西,但是任何朝着正确方向的推动或指出都是非常值得赞赏的。

我也没有被锁定在logback中,因此如果有一种更简单/更好的方法,例如使用log4j2,我洗耳恭听

共有1个答案

傅泉
2023-03-14

要屏蔽可配置字段,您需要像下面这样创建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>

此配置将扫描所有日志语句,并匹配“password”或“email”(无论您在logback.xml编码器中配置了哪个),其值将替换为****

e. g

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

在日志中,上述语句将显示为,

Received sign-up request, password=*****************
 类似资料:
  • 我需要能够在事件中搜索多种模式中的任何一种,并用掩码值替换模式中的文本。这是我们应用程序中的一项功能,旨在防止敏感信息落入日志。由于信息可能来自各种来源,因此对所有输入应用过滤器是不切实际的。除了日志记录之外,toString()还有其他用途,我不希望toString()对所有调用(仅日志记录)进行统一屏蔽。 我尝试在logback中使用%替换方法。xml: 这是成功的(在用字符实体替换尖括号之后

  • 使用CXF调用SOAP Web服务后,CXF客户端记录SOAP请求消息,密码可见!我想从CXF客户端日志记录中隐藏密码等敏感数据。 以下是我在日志中得到的信息: 我只想将mypassword替换为code 我尝试了此解决方案,但它与我的CXF版本不兼容,因为它使用的是旧版本的CXF。 我真的看到了很多例子,一些扩展了LoggingOutInterceptor,其他扩展了AbstractSoapIn

  • 本文向大家介绍Nginx屏蔽F5心跳日志、指定IP访问日志,包括了Nginx屏蔽F5心跳日志、指定IP访问日志的使用技巧和注意事项,需要的朋友参考一下 注:192.168.0.2是F5内网地址。 下面的配置经测试是失败的,依然记录访问日志: 推测是日志记录在deny前执行,执行到deny返回403 Forbidden。

  • 本文向大家介绍分析nginx日志并屏蔽采集者ip(nginx屏蔽ip配置实例),包括了分析nginx日志并屏蔽采集者ip(nginx屏蔽ip配置实例)的使用技巧和注意事项,需要的朋友参考一下 采集和防止采集是一个经久不息的话题,一方面都想搞别人的东西,另一方面不想自己的东西被别人搞走。 本文介绍如何利用nginx屏蔽ip来实现防止采集,当然也可以通过iptable来实现。 1.查找要屏蔽的ip n

  • 同样的规则也将应用于destination_num。表中的现有值需要替换为屏蔽值。我读过一些关于Oracle12c中数据编辑的文章,但提到了它,因为我们只能选择屏蔽数据,而不能选择更新。

  • 使用java.util.Logging时,可以在logging.properties文件中配置特定类的日志级别(即具有类名称的子记录器),如下所示: 我使用类名在MyClass中创建子记录器,如下所示: 在Google Web Toolkit gwt.xml文件中有类似的配置方法吗?