logback 有条件地为自定义消息转换器添加不同的模式

问题描述 投票:0回答:1

我正在使用 logback 来记录来自同一模块内不同 Rest 端点的 Json 消息。我的尝试是将所有请求响应记录到一个文件中。问题是某些端点需要屏蔽敏感数据,而其他端点则不需要。 我的尝试是创建自定义 MessageConverter,并在 logback 配置文件中传递不同的选项。

<configuration>
<conversionRule conversionWord="mask" converterClass="com.me.filter.MessageCompositeConverter" />

我有一个附加程序,它有一个也使用 conversionWord 的模式

<appender name="AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        </encoder>
    <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %mask(%m){ssn, email}%n</pattern>          
        </encoder>
</appender>

这里我只提供两个选项ssn,电子邮件,但我有大约9个这样的选项或密钥,我后来用来屏蔽。

 MessageCompositeConverter extends CompositeConverter<ILoggingEvent> {
    private MaskUtil maskUtil;

    @Override
    public void start() {
        maskUtil = new MaskingUtils();
        maskUtil.init(getOptionList());//ssn and email options
        super.start();
    }

    
    @Override
    protected String transform(ILoggingEvent event, String in) {
        StringBuilder msg = new StringBuilder(in);
                //mask method takes the messages, and uses the options set at the start() method
               // and does a switch to calls different masking methods for different sensitive data
        maskUtil.mask(msg);
        return maskUtil.getMessageBuilder().toString();
    }

switch 语句类似如下

public String mask(String message )
....
for (int i = 0, i < options.size();i++
     switch(options.get(i)
       case "email"
          maskEmail
         break;
       case "ssn":
         maskSSN
         .....

在上述当前实现中,每条正在记录的消息都会运行开关

问题是某些端点没有要屏蔽的敏感数据。在这种情况下,我会运行我的屏蔽逻辑,即使不需要它。 如果可能的话,有没有办法在 logback xml 文件中有条件地添加不同的模式?

Example if message.contains("serviceid_1") 
           <pattern>....</pattern>
           message.contains("serviceid_2")
           <pattern>....</pattern>
logback masking
1个回答
0
投票

Logback 不直接在其 XML 配置文件中支持条件模式。

您可以在 CompositeConverter 的转换方法中实现条件逻辑,以根据消息内容决定需要应用哪些类型的屏蔽。

如果消息不包含敏感数据,您可以绕过屏蔽逻辑。

   @Override
    protected String transform(ILoggingEvent event, String in) {
        if (in.contains("serviceid_1")) {
            // apply masking for serviceid_1
            maskUtil.mask(in, "ssn");
        } else if (in.contains("serviceid_2")) {
            // apply masking for serviceid_2
            maskUtil.mask(in, "email");
        } else {
            // no masking required
            return in;
        }
        return maskUtil.getMessageBuilder().toString();
    }
© www.soinside.com 2019 - 2024. All rights reserved.