Log4j日志分类和过滤敏感字段

项目上线时,需要对项目做安全检查,其中有两项是对输出日志进行分类和过滤掉日志中敏感字段。
项目使用Log4j日志系统,下面简单介绍下这两项要求的实现方式。

  1. 对日志进行分类,要求调用其他服务的API日志按照格式单独输出到一个文件。
    方式: 除根Logger外,再额外增加一个apiLogger,如下,
 
 
        
        
        
 
 
 
 
        
        
        
 

注: (1) additivity设为false,则root中的配置就失效了。即使用root配置的日志不会在apiLogger的文件中出现;
(2) 每种logger指定两个appender,分别是在debug console和Linux 服务器日志文件中显示。
根日志的ConsoleAppender和DailyRollingFileAppender的配置如下:


    
    
        
        
    


    
    
    
    
    
    
    
    
    
    
        
        
    

    
    
        
        
    

    
        
        
    

    
        
        
    

    
        
        
    

    
    
        
        
    

    
    
        
        
    


apiLogger的apiConsoleAppender和apiMsgOutGoingAppender设置如下:



    
    
        
        
    


    
    
    
    
    
    
    
    
    
    
    
    
        
        
    

注:(1) Log4j系统Appender组件负责日志的输出配置,包括输出目录,最大输出大小,输出文件数等;Layout组件负责日志输出的格式。
(2)JAVA代码在使用日志系统时,默认用根日志的配置输出,若想使用apiLogger,使用:
private static Logger log = Logger.getLogger("log4j.logger.apiLogger");
(3)日志layout中传入自定义参数,使用MDC类:

public static void configAndPrintAPILogger(Logger logger, int statusCode, String method, String url,
        long responseTime,
        int requestLength, int responseLength)
    {
        String endpoint = url.split("/")[2];
        MDC.put("og.serverIp", endpoint);
        MDC.put("og.respTime", responseTime);
        //截取 https://endpoint之后的
        MDC.put("og.visitUri", method + " " + url.substring(8 + endpoint.length()));
        MDC.put("og.statusCode", statusCode);
        MDC.put("og.reqLen", requestLength);
        MDC.put("og.respLen", responseLength);
        logger.info("");
    }

经上述配置后,日志的输出如下:
Log4j日志分类和过滤敏感字段_第1张图片
2. 日志中过滤敏感字符,如password, PW, adminPass等。如DailyRollingFileAppender中所示,使用StringMatchFilter:

        
        
            
            
        

StringMatchFilter中使用msg.indexOf(StringToMatch)参数判断是否过滤,即该条日志包含指定字段,若AcceptOnMatch设置为false,则不输出。
需要注意的是,log4j日志系统采用xml格式时才能用该种方式过滤,properties格式时不能用此方法。

你可能感兴趣的:(SSM,Log4j,日志分级)