在我们书写代码的时候,会书写许多日志代码,但是有些敏感数据是需要进行安全脱敏处理的。
对于日志脱敏的方式有很多,常见的有①使用conversionRule标签,继承MessageConverter②书写一个脱敏工具类,在打印日志的时候对特定特字段进行脱敏返回。
两种方式各有优缺点:
第一种方式需要修改代码,不符合开闭原则。
第二种方式,需要在日志方法的参数进行脱敏,对原生日志有入侵行为。

自定义脱敏组件(slf4j+logback)
一个项目在书写了很多打印日志的代码,但是后面有了脱敏需求,如果我们去手动改动代码,会花费大量时间。如果引入本组件,完成配置即可轻松完成脱敏。(仅需三步可轻松配置)

一、自定义脱敏组件 - 脱敏效果演示

二、自定义脱敏组件 - 使用方式

1、引入Jar包依赖

前提是你将Jar包打入本地仓库,Jar包地址见后文。

<dependency><groupId>pers.liuchengyin</groupId><artifactId>logback-desensitization</artifactId><version>1.0.0</version>
</dependency>

2、替换日志文件配置类(logback.xml)

日志打印方式都只需要替换成脱敏的类即可,如果你的业务不需要,则无需替换。
①ConsoleAppender - 控制台脱敏

// 原类
ch.qos.logback.core.ConsoleAppender
// 替换类
pers.liuchengyin.logbackadvice.LcyConsoleAppender

②RollingFileAppender - 滚动文件

// 原类
ch.qos.logback.core.rolling.RollingFileAppender
// 替换类
pers.liuchengyin.logbackadvice.LcyRollingFileAppender

③FileAppender - 文件

// 原类
ch.qos.logback.core.FileAppender
// 替换类
pers.liuchengyin.logbackadvice.LcyFileAppender

「替换示例:」

<property name="CONSOLE_LOG_PATTERN"value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/><!-- ConsoleAppender 控制台输出日志 -->
<appender name="CONSOLE" class="pers.liuchengyin.logbackadvice.LcyConsoleAppender"><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern></encoder>
</appender>

3、添加脱敏配置文件(logback-desensitize.yml)

该配置文件应该放在resources文件下

脱敏配置文件

三、自定义脱敏组件 - 脱敏规范

1、支持数据类型

八大基本类型及其包装类型、Map、List、业务里的Pojo对象、List<业务里的Pojo对象>、JSON字符串。
注:在配置文件中配置的时候,只需要配置对象里的属性值就行。

2、不支持的数据类型

List<八大基本类型及包装类型>,因为不知道脱敏的数据源具体是哪一个。

3、匹配规则

key + 分割符 + value,目前仅支持冒号(:)和等号(=),示例如下:

log.info("your email:{}, your phone:{}", "123456789@qq.com","15310763497");
log.info("your email={}, your cellphone={}", "123456789@qq.com","15310763497");

key:定义了对应需要脱敏的关键字,如上诉的email、phone等以及业务对象中的字段、Map中的Key、JSON中的Key
value:需要脱敏的值,如上诉的123456789@qq.com、15310763497。

4、日志规范

建议书写日志的时候尽量规范,对于key为中文的是没有办法脱敏的,规范程度可以见脱敏效果演示里的代码。

四、logback-desensitize.yml配置说明

# 日志脱敏
log-desensitize:# 是否忽略大小写匹配,默认为trueignore: true# 是否开启脱敏,默认为falseopen: true# pattern下的key/value为固定脱敏规则pattern:# 邮箱 - @前第4-7位脱敏email: "@>(4,7)"# qq邮箱 - @后1-3位脱敏qqemail: "@<(1,3)"# 姓名 - 姓脱敏,如*杰伦name: 1,1# 密码 - 所有需要完全脱敏的都可以使用内置的passwordpassword: passwordpatterns:# 身份证号,key后面的字段都可以匹配以下规则(用逗号分隔)- key: identity,idcard# 定义规则的标识custom:# defaultRegex表示使用组件内置的规则:identity表示身份证号 - 内置的18/15位- defaultRegex: identityposition: 9,13# 内置的other表示如果其他规则都无法匹配到,则按该规则处理- defaultRegex: otherposition: 9,10# 电话号码,key后面的字段都可以匹配以下规则(用逗号分隔)- key: phone,cellphone,mobilecustom:# 手机号 - 内置的11位手机匹配规则- defaultRegex: phoneposition: 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: otherposition: 1,3# 这种方式不太推荐 - 一旦匹配不上,就不会脱敏- key: localMobilecustom: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

「3、自定义正则脱敏」

  patterns:# 手机号- key: phone,mobilecustom:# 手机号的正则- customRegex: "^1[0-9]{10}"# 脱敏范围position: 4,7

customRegex:正则表达式,如果符合该表达式,则使用其对应的脱敏规则(position)

「4、一个字段,根据多种值含义进行自定义脱敏」
比如说,username字段的值可以是手机号、也可以是邮箱,这个值动态改变的,前面几种方式都没办法解决,可以使用该方式。

patterns:- key: usernamecustom:# 手机号 - 11位- defaultRegex: phoneposition : 4,7# 邮箱 - @- defaultRegex: emailposition : "@>(3,12)"# 身份证 - 15/18位- defaultRegex: identityposition : 1,3# 自定义正则- customRegex: "^1[0-9]{10}"position : 1,3# 都匹配不到时,按照这种规则来- defaultRegex: otherposition : 1,3

注意:上面示例中匹配规则里的 双引号和括号 都不能省略
该组件内置四种匹配规则:手机号、身份证号、邮箱、other(其他匹配不到时用的),内置一种脱敏方式:password,表示完全脱敏,可用于pattren下的。

注:当pattern和patterns下的key有重复的时候,只会使用pattern下指定的方式进行脱敏。

demo源码

目前我已经从我们的生产环境中的真实代码中,抽取了Logback和slf4j的日志脱敏组件Demo项目。我自己也封装 jar 包,方便公司其他项目使用。

本文已经贴出了主要的核心实现代码,如果有兴趣,想继续研究学习的,可以加我微信,发送给你!

Jar包打入Maven本地仓库的方式

1、可以直接通过我的 demo 项目中的Jar包,放在一个文件夹里
2、在这个文件夹里打开cmd(打开cmd,进入到这个文件夹)
3、执行命令(前提保证maven配置正常,使用mvn -v命令查看是否正常,如果显示版本号表示正常)

mvn install:install-file -DgroupId=pers.liuchengyin -DartifactId=logback-desensitization -Dversion=1.0.0 -Dpackaging=jar -Dfile=logback-desensitization-1.0.0.jar

「命令说明:」

 -DgroupId表示jar对应的groupId  <groupId>pers.liuchengyin</groupId>-DartifactId:表示jar对应的artifactId<artifactId>logback-desensitization</artifactId>-Dversion表示jar对应的 version<version>1.0.0</version>

git地址:GitHub - liuchengyin01/LogbackDesensitization: Logback+Slf4j,基于SpringBoot实现日志脱敏

【【SpringBoot系列】最详细demo--自定义日志脱敏组件,简单3 步完成 Spring Boot 的日志脱敏相关推荐

  1. 3 步完成 Spring Boot 的日志脱敏

    在我们书写代码的时候,会书写许多日志代码,但是有些敏感数据是需要进行安全脱敏处理的. 对于日志脱敏的方式有很多,常见的有①使用conversionRule标签,继承MessageConverter②书 ...

  2. Spring Boot Admin在线查看spring boot后台日志

    当前,应用系统微服务架构.前后端分离(前端vue,后端springboot),已经成为大部分项目的标准技术架构,但在项目上线后,spring boot后端服务部署在服务器上,大部分公司对服务器都有安全 ...

  3. 54. spring boot日志升级篇—logback【从零开始学Spring Boot】

    在<44. Spring Boot日志记录SLF4J>章节中有关相关的介绍,这里我们在深入的了解下logback框架. 为什么要使用logback ? --在开发中不建议使用System. ...

  4. Spring Boot SLF4J日志实例

    From: https://blog.csdn.net/lxh18682851338/article/details/78560295 默认情况下,SLF4j日志记录包含在Spring Boot We ...

  5. SpringBoot2.1.5(16)--- Spring Boot的日志详解

    SpringBoot2.1.5(16)--- Spring Boot的日志详解 市面上有许多的日志框架,比如 JUL( java.util.logging), JCL( Apache Commons ...

  6. 【spring boot】8.spring boot的日志框架logback使用

    在继续上一篇的Debug调试之后,把spring boot的日志框架使用情况逐步蚕食. 参考:http://tengj.top/2017/04/05/springbo 开篇之前,贴上完整applica ...

  7. Spring Boot统一日志框架

    在项目开发中,日志十分的重要,不管是记录运行情况还是定位线上问题,都离不开对日志的分析.在 Java 领域里存在着多种日志框架,如 JCL.SLF4J.Jboss-logging.jUL.log4j. ...

  8. 12. Spring Boot统一日志框架

    在项目开发中,日志十分的重要,不管是记录运行情况还是定位线上问题,都离不开对日志的分析.在 Java 领域里存在着多种日志框架,如 JCL.SLF4J.Jboss-logging.jUL.log4j. ...

  9. spring boot—默认日志框架配置

    文章目录 默认日志框架--配置全解 日志格式 日志级别 日志输出到控制台 日志输出到文件 spring boot2.2.4官方文档 默认日志框架–配置全解 #日志记录 logging:#日志级别lev ...

最新文章

  1. Arm Cortex-M3 MCU性能
  2. python编程入门t-Python GUI编程完整示例
  3. Go语言接口(interface)简单应用
  4. 2021年office2010每次打开都要配置进度解决方法
  5. Qt学习笔记-----Graphics_View_Framework
  6. Power Bi:DAX函数总结
  7. php到期自动过期,PHP实现页面长时间无操作,自动过期函数
  8. iOS开发拓展篇—CoreLocation地理编码
  9. html 给一个无限宽,html – CSS div与其内容一样宽
  10. python怎么排名次_2019:python第3次获得TIOBE最佳年度语言排名
  11. C语言 符号配对 (20分)
  12. IRedMail迁移方案
  13. cad插入块_CAD施工制图常见问答(一)
  14. 加百列丨浅谈大水面水产养殖的几个误区及对策
  15. 使用命令行修复windows系统
  16. sprintf和fprintf
  17. 使用cgo,由于内存释放导致内存无效,引起的http crash
  18. word 2016 无法输入中文 输入法失效 只能输入英文
  19. java 8 stream 对集合的简单操作
  20. 2008年的各国卫星导航系统比较(北斗、伽利略、GLONASS、GPS)

热门文章

  1. 银行自助设备详细介绍(二)——多媒体查询机
  2. 5天学会fx-5800计算器测量编程(一)
  3. 开源授权协议GPL和LGPL的区别
  4. 一个SRM系统应该包含哪些模块?
  5. 值得收藏的6个资源网站,10T硬盘都不够装,老司机直称好用
  6. git clean -fdx
  7. python put指令是什么意思_队列.put(),放入什么项目()?
  8. (_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用
  9. 数字藏品平台开发|通过我们的 NFT 音乐市场开发服务发现您独特的音乐
  10. python代码优化指南_扣丁学堂Python视频教程之Pandas初学者代码优化指南