我正在使用 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 不直接在其 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();
}