日志

日志自动脱敏

Posted by lijian on March 15, 2020

基于 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 , 不过代码写入的好处就是对于日志文件的侵入性小