出于日志目的,在我一直在工作的项目中使用了Jackson的writeValueAsString(object)方法,而不是使用toString()方法。
LOGGER.info(mapper.writeValueAsString(object));现在,我得到了在日志中屏蔽密码和信用卡号码等敏感信息的要求。如果正在使用toString(),我可以从toString()方法中删除这些敏感数据。但在我的情况下,我找不到这样简单而正确的方法来解决我的问题。我不是在这样的情况下,我可以改变整个事情来使用toString()。
我读到,通过使用%replace方法,我可以使用预定义的模式替换不需要登录的数据。但所有需要屏蔽的敏感数据都不会遵循单一模式。
我尝试截取日志事件,查找特定信息并屏蔽它们(使用实现LogEventFactory的类)。即使它是一个有效的解决方案,我也不认为它是一个好的解决方案,因为每次寻找大字符串中的数据都会花费很大的成本。
有没有什么办法是我还没有解决我的问题的?使用%replace的方法是可行的吗?如果是这样的话,是怎么做的?
发布于 2018-12-21 14:27:55
我认为有三种方法可以解决你的问题,你都提到了。最有效的方法是防止将敏感数据记录到记录器中,这需要做大量的工作。
第二种方法是修改附加器。通过扩展log4j Appender,您可以修改LogEvent。
最后一种方法是修改PatternLayout。这是一个example。
public class CardNumberFilteringLayout extends PatternLayout {
private static final String MASK = "$1++++++++++++";
private static final Pattern PATTERN = Pattern.compile("([0-9]{4})([0-9]{9,15})");
@Override
public String format(LoggingEvent event) {
if (event.getMessage() instanceof String) {
String message = event.getRenderedMessage();
Matcher matcher = PATTERN.matcher(message);
if (matcher.find()) {
String maskedMessage = matcher.replaceAll(MASK);
@SuppressWarnings({ "ThrowableResultOfMethodCallIgnored" })
Throwable throwable = event.getThrowableInformation() != null ?
event.getThrowableInformation().getThrowable() : null;
LoggingEvent maskedEvent = new LoggingEvent(event.fqnOfCategoryClass,
Logger.getLogger(event.getLoggerName()), event.timeStamp,
event.getLevel(), maskedMessage, throwable);
return super.format(maskedEvent);
}
}
return super.format(event);
}
}https://stackoverflow.com/questions/49143855
复制相似问题