基于 logback filter 拦截并脱敏参数
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import com.jovision.vpass.pms.common.util.LogEncodeUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.Objects;
/**
* @author lijian@jovision.com
* @date 2020/8/12
* @see http://logback.qos.ch/manual/filters.html
**/
@Slf4j
public class LogbackEncodeFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent event) {
Object[] argumentArray = event.getArgumentArray();
if (Objects.nonNull(argumentArray)) {
for (int i = 0; i < argumentArray.length; i++) {
Object param = argumentArray[i];
if (Objects.nonNull(param)) {
param = LogEncodeUtils.encodeInfo(param.toString());
argumentArray[i] = param;
}
}
}
return FilterReply.NEUTRAL;
}
}
基于 CommandLineRunner 为每个Appender 添加Filter
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
/**
* @author lijian@jovision.com
* @date 2020/8/12
**/
@Slf4j
@Component
public class LogbackCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
ch.qos.logback.classic.LoggerContext loggerContext = (ch.qos.logback.classic.LoggerContext) LoggerFactory.getILoggerFactory();
if (Objects.isNull(loggerContext) || CollectionUtils.isEmpty(loggerContext.getLoggerList())) {
log.warn("logback append add encode filter fail ...");
return;
}
List<Logger> loggerList = loggerContext.getLoggerList();
loggerList.forEach(item -> {
Iterator<Appender<ILoggingEvent>> appenderIterator = item.iteratorForAppenders();
while (appenderIterator.hasNext()) {
Appender<ILoggingEvent> appender = appenderIterator.next();
LogbackEncodeFilter logbackEncodeFilter = new LogbackEncodeFilter();
appender.addFilter(logbackEncodeFilter);
}
});
log.info("logback append add encode filter success ...");
}
}
ps
也可以手动写入 filter , 不过代码写入的好处就是对于日志文件的侵入性小