本文描述了一种使用logback进行项目中打印的日志进行脱敏的一种处理方法,通过底层消息转换,字段过滤,以及数据加密,对象lazy化多种方法来完成整个实现体系。
参考文章:https://blog.csdn.net/lrcxl/article/details/78723756 关于实现log4j2日志脱敏的一种方案
整个实现分为以下4个步骤
- 底层消息转换 logback层提供扩展方法,允许注入额外的参数填充实现
- 字段过滤 参数toString化工具处理
- 数据加密 信息加/解密处理
- 对象lazy化, 多种信息转换实现
1 logback层提供扩展方法,允许注入额外的参数填充实现
以下实现中修改了logback-classic的源码, 修改点为 LoggingEvent#getFormattedMessage
我们在logback-classic版本中提供了用于处理消息和参数进行格式化的处理类接口如下
public interface LogbackMessageFormat { String format(String message, Object[] argumentArray); }
其默认实现为
public class Slf4jLogbackMessageFormat implements LogbackMessageFormat { @Override public String format(String message, Object[] argumentArray) { return MessageFormatter.arrayFormat(message, argumentArray).getMessage(); } }
此即为原logback-classic的默认实现。 为了让外部注入额外的实现,提供了一个工厂类,以让外部设置新的处理实现,如下参考所示:
public class LogbackMessageFormatFactory { @Getter @Setter private static LogbackMessageFormat INSTANCE = new Slf4jLogbackMessageFormat(); }
通过此工厂方法,即可设置自己的实现了,一个用于脱敏的参考实现如下
public class SelfImpl implements LogbackMessageFormat { @Override public String format(String message, Object[] argumentArray) { ...... //以下代码为将参数对象toString化,相应的脱敏即隐藏在此方法中 for(int i = 0; i < size; i++) { argumentArray[i] = ToStringUtils.toString(argumentArray[i]); } //调用原始格式化信息为字符串 return StringUtils.format(message, argumentArray); } }