ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Logback和slf4j的日志脱敏组件 ## 前言 对于日志脱敏的方式有很多,常见的有①使用conversionRule标签,继承MessageConverter②书写一个脱敏工具类,在打印日志的时候对特定特字段进行脱敏返回。 两种方式各有优缺点:第一种方式需要修改代码,不符合开闭原则。第二种方式,需要在日志方法的参数进行脱敏,对原生日志有入侵行为。 ## 本组件说明 本组件基于非入侵及脱敏字段扩展考虑,采用yml配置文件来扩展脱敏字段及不同的脱敏规则。其核心思想就是:读取配置文件里的脱敏字段和其脱敏规则。在日志替换的时候将字段进行脱敏。 本组件基于logback+slf4j,暂不支持log4j,如需解决log4j的日志,可以参照本组件的思想去完成。 本组件支持的脱敏数据类型:八大基本类型及其包装类型、String类型、Map、List、JSON字符串、项目中的POJO对象。 注:Map、JSON、List、POJO、List对象的脱敏处理需要配置其对应的字段名即可,无法处理List类型。 在使用本组件的时候,一定要注重日志打印规范。 具体使用方式见博客(重要!重要!重要!):https://blog.csdn.net/qq\_40885085/article/details/113385261 ## 匹配规则: key + 分割符 + value,如phone:{},即phone:13436781234。如email={},即email=123456789@qq.com 本组件默认只支持冒号和等号分割,如需其他方式可以修改正则匹配方式(本组件的正则匹配是匹配的key:value和key=value) 如: ```java log.info("your email:{}, your phone:{}", "123456789@qq.com","15310763497"); log.info("your email={}, your cellphone={}", "123456789@qq.com","15310763497"); ``` ## 使用方式 1、在logback-spring.xml同级新增logback-desensitize.yml配置 logback-desensitize.yml配置示例 ``` # 日志脱敏 log-desensitize: # 是否忽略大小写匹配,默认为true ignore: true # 是否开启脱敏,默认为false open: true # pattern下的key/value为固定脱敏规则 pattern: # 邮箱 - @前第4-7位脱敏 email: "@>(4,7)" # qq邮箱 - @后1-3位脱敏 qqemail: "@<(1,3)" # 姓名 - 姓脱敏,如*杰伦 name: 1,1 # 密码 - 所有需要完全脱敏的都可以使用内置的password password: password patterns: # 身份证号,key后面的字段都可以匹配以下规则(用逗号分隔) - key: identity,idcard # 定义规则的标识 custom: # defaultRegex表示使用组件内置的规则:identity表示身份证号 - 内置的18/15位 - defaultRegex: identity position: 9,13 # 内置的other表示如果其他规则都无法匹配到,则按该规则处理 - defaultRegex: other position: 9,10 # 电话号码,key后面的字段都可以匹配以下规则(用逗号分隔) - key: phone,cellphone,mobile custom: # 手机号 - 内置的11位手机匹配规则 - defaultRegex: phone position: 4,7 # 自定义正则匹配表达式:座机号(带区号,号码七位|八位) - customRegex: "^0[0-9]{2,3}-[0-9]{7,8}" # -后面的1-4位脱敏 position: "-<(1,4)" # 自定义正则匹配表达式:座机号(不带区号) - customRegex: "^[0-9]{7,8}" position: 3,5 # 内置的other表示如果其他规则都无法匹配到,则按该规则处理 - defaultRegex: other position: 1,3 # 这种方式不太推荐 - 一旦匹配不上,就不会脱敏 - key: localMobile custom: customRegex: "^0[0-9]{2,3}-[0-9]{7,8}" position: 1,3 ``` > 自定义脱敏支持的方式 > 1、key:value的方式 > phone:4,7,表示phone属性的4-7位进行脱敏 > 原始数据:13610357861 > 脱敏后:136****7861 > > 2、以符号作为起始、结束节点作为脱敏标志 > emai:"@>(4,7)",@为脱敏标志,>表示其为结束节点,<表示其为开始节点。即@>表示对@之前的进行脱敏,@<表示对@之后的进行脱敏。这个示例就是@前的数据的第4-7位进行脱敏。注意:这种规则里的双引号、括号不能省略,其次:和=不能作为标志符号,因为和匹配规则有冲突 > 原始数据:123456789@qq.com > "@>(4,7)"脱敏后:123****89@qq.com > "@<(1,3)"脱敏后:123456789@***com > 2、在logback.xml中引入对应的Appender,使用组件里的类代替原来的 #### ①ConsoleAppender - 控制台脱敏 原配置类: ```java ch.qos.logback.core.ConsoleAppender ``` 替换类: ```java pers.liuchengyin.logbackadvice.LcyConsoleAppender ``` #### ②RollingFileAppender - 滚动文件 原配置类: ```java ch.qos.logback.core.rolling.RollingFileAppender ``` 替换类: ```java pers.liuchengyin.logbackadvice.LcyRollingFileAppender ``` #### ③FileAppender - 文件 原配置类: ```java ch.qos.logback.core.FileAppender ``` 替换类: ```java pers.liuchengyin.logbackadvice.LcyFileAppender ```