使用log4j2实现日志数据脱敏(sm4加密)


一、目录简介

 项目已经上线运行五年之久,积累了大量的用户身份数据。由于软件设计之初未对用户敏感字段与数据做脱敏加密处理,用户信息存在安全风险。本项目需求涉及到的客户敏感数据泄露风险点及系统改造风险点主要包括以下几个方面:

Ø 客户敏感信息:身份证号、手机号、银行卡号、住址等客户敏感数据。

Ø 与其他异构系统[i]接口交互使用明文传输

现在的log4j,apache不在更新版本,现在维护log4j2,同时用起来比较方便,


二、log4j2的使用

目录

  • log4j223入门学习与总结
    • 大纲
      • 目录
        • 一log4j2 配置文件加载
        • 二log4j2 配置文件结构图
        • 三log4j2 配置文件说明
        • 四log4j2 AppenderschildFilterThresholdFilter 的使用
        • 五log4j2 实战示例
        • 六log4j2 logger 加载规则

一、log4j2 配置文件加载

log4j2 的配置文件只用 xml、json、jsn 三种格式,默认情况下由系统自动加载,系统加载 classpath 目录如下的配置文件:
- log4j-test.json 或者 log4j-test.jsn 文件
- log4j2-test.xml
- log4j-test.json 或者 log4j-test.jsn 文件
- log4j2.xml
加载优先级由上向下,且只加载其一。

二、log4j2 配置文件结构图

使用log4j2实现日志数据脱敏(sm4加密)_第1张图片

三、log4j2 配置文件说明

1、configration

字段 描述
status 日志级别 默认值为最高级别 OFF
monitorInterval 监控间隔,例如:monitorInterval=”600” 指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置


2、Appenders 定义输出类型
1) Child

字段 描述
Layout 输出类型的模板、布局
Filters 过滤器,过滤掉不需要的日志


2)Filters.ThresholdFilter

字段 描述
level 输出级别,例:level=”info”,日志级别为info或者以上(匹配的界别)
onMatch DENY/ACCEPT 禁止或者接受(是否接受匹配)
onMismatch DENY/NEUTRAL (是否接受其他高于level的级别)


一般的组合为:

  • onMatch=”DENY” onMismatch=”NEUTRAL “
  • onMatch=”ACCEPT ” onMismatch=”DENY”

3、Loggers 注册日志输出对象
1) Logger 日志输出对象

字段 解释
name 输出对象名称
level 日志级别
additivity 是否冒泡,既在本层输出日志后是否需要在父对象上输出该日志,默认为 true

代码说明

<Root level="info"> <AppenderRef ref="Appender3" />Root><logger level="warn" name="com.person" additivity="false"> <AppenderRef ref="Appender1" />logger><logger level="info" name="com.person.man" additivity="true"> <AppenderRef ref="Appender2" />logger>

在 com.person.man 包下面或者类下面执行以下代码

logger.info("man info");    // Appender1、Appender2 有输出
logger.error("man error");  // Appender1、Appender2 有输出
logger.warn("man warn");    // Appender1、Appender2 有输出
  • 1
  • 2
  • 3

四、log4j2 Appenders.child.Filter.ThresholdFilter 的使用




<configuration status="off" monitorInterval="600"> 
  <properties>
    <property name="LOG_HOME">logsproperty>
    <property name="ERROR_FILE_NAME">myErrorproperty>
    <property name="WARN_FILE_NAME">myWarnproperty>
    <property name="INFO_FILE_NAME">myInfoproperty>
    <property name="DEBUG_FILE_NAME">myDebugproperty>
  properties>
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} {%t} %-5level %logger{36} - %msg%n"/>
    Console>
    <File name="infoLog" fileName="E:/info.log" append="true" >
      <PatternLayout pattern="%d %5p [%c:%l] - %m%n"/>
      <Filters>
      
        <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
        <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
      Filters>
    File>
    <File name="warnLog" fileName="E:/warn.log" append="true" >
      <PatternLayout pattern="%d %5p [%c:%l] - %m%n"/>
      <Filters>
      
        <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
        <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
      Filters>
    File>
    <File name="errorLog" fileName="E:/error.log" append="true" >
      <PatternLayout pattern="%d %5p [%c:%l] - %m%n"/>
      <Filters>
      
        <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
      Filters>
    File>
  Appenders>
  <Loggers>
    <Root level="info">
        <AppenderRef ref="infoLog" />
        <AppenderRef ref="warnLog" />
        <AppenderRef ref="errorLog" />
    Root>
  Loggers>
configuration>

五、log4j2 实战示例

1、根据日志级别输出到不同文件,按日期进行封存日志




<configuration status="off" monitorInterval="600"> 
  <properties>
    <property name="LOG_HOME">E:/webbase/logsproperty>
    <property name="LOG_BACK_HOME">${LOG_HOME}/backupproperty>
    <property name="ERROR_FILE_NAME">errorproperty>
    <property name="WARN_FILE_NAME">warnproperty>
    <property name="INFO_FILE_NAME">infoproperty>
    <property name="DEBUG_FILE_NAME">debugproperty>
  properties>
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} {%t} %-5level %logger{36} - %msg%n"/>
    Console>
        
    
    <RollingFile name="ErrLog" fileName="${LOG_HOME}/${ERROR_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${ERROR_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true">  
            
        <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>  
          
        <Policies>    
              
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />   
        Policies> 
        <Filters>
         <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
        Filters>
    RollingFile> 

    
    <RollingFile name="WarnLog" fileName="${LOG_HOME}/${WARN_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${WARN_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true">  
            
        <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>  
          
        <Policies>    
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />   
        Policies> 
        <Filters>
          <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
          <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
        Filters>
    RollingFile> 
    
    <RollingFile name="InfoLog" fileName="${LOG_HOME}/${INFO_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${INFO_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true">  
            
        <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>  
          
        <Policies>    
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />   
        Policies> 
        <Filters>
          <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
          <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
        Filters>
    RollingFile> 
    
    <RollingFile name="DebugLog" fileName="${LOG_HOME}/${DEBUG_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${DEBUG_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true">  
            
        <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>  
          
        <Policies>    
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />   
        Policies> 
        <Filters>
          <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
          <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
        Filters>
    RollingFile> 
  Appenders>
  <Loggers>
    <Logger name="org.webbase" level="debug" additivity="true">
        <AppenderRef ref="DebugLog" />
        <AppenderRef ref="InfoLog" />
    Logger>
    <Root level="warn">
        <AppenderRef ref="WarnLog" />
        <AppenderRef ref="ErrLog" />
        <AppenderRef ref="Console"/>
    Root>
  Loggers>
configuration>

TimeBasedTriggeringPolicy

属性 解释
interval (integer)该属性是相对 RollingFile.filePattern 中的
%d{yyyy-MM-dd}值,例:
filePattern=”xxx%d{yyyy-MM-dd}xx” interval=”2” 表示将2天一个日志文件;
filePattern=”xxx%d{yyyy-MM-dd-HH}xx” interval=”1”表示一个小时一个日志文件
modulate (boolean)以0点为边界进行偏移计算

六、log4j2 logger 加载规则

  1. logger name 相同时,以 level 级别高的为准
  2. logger name = “org” 会被 name=”org.xxx” 继承
  3. logger 中的 additivity=”true” 表示子日志所获得的日志也会在父日志中出现,即使 父日志的 level 远高于子日志的 level
  4. 当子日志 level 大于 父日志时,父日志只能接收到子日志过滤后的日志

这里才是真正的sm加密log4 的项目上面只是对 log4j2的配置预热

  第一是pom文件的配置

   

 


你可能感兴趣的:(使用log4j2实现日志数据脱敏(sm4加密))