Java的logback自定義日志脫敏組件詳解
前言
在我們寫(xiě)代碼的時(shí)候,會(huì)書(shū)寫(xiě)許多日志代碼,但是有些敏感數(shù)據(jù)是需要進(jìn)行安全脫敏處理的。
對(duì)于日志脫敏的方式有很多,常見(jiàn)的有: ①使用conversionRule標(biāo)簽,繼承MessageConverter ②書(shū)寫(xiě)一個(gè)脫敏工具類(lèi),在打印日志的時(shí)候?qū)μ囟ㄌ刈侄芜M(jìn)行脫敏返回。
兩種方式各有優(yōu)缺點(diǎn):第一種方式需要修改代碼,不符合開(kāi)閉原則。第二種方式,需要在日志方法的參數(shù)進(jìn)行脫敏,對(duì)原生日志有入侵行為。
一個(gè)項(xiàng)目在書(shū)寫(xiě)了很多打印日志的代碼,但是后面有了脫敏需求,如果我們?nèi)ナ謩?dòng)改動(dòng)代碼,會(huì)花費(fèi)大量時(shí)間。如果引入本組件,完成配置即可輕松完成脫敏。(僅需三步可輕松配置。
脫敏效果演示
使用方式
1、引入Jar包依賴(lài)
前提是你將Jar包打入本地倉(cāng)庫(kù),Jar包地址見(jiàn)后文。
<dependency> <groupId>pers.liuchengyin</groupId> <artifactId>logback-desensitization</artifactId> <version>1.0.0</version> </dependency>
2、替換日志文件配置類(lèi)(logback.xml)
日志打印方式都只需要替換成脫敏的類(lèi)即可,如果你的業(yè)務(wù)不需要,則無(wú)需替換。
①ConsoleAppender - 控制臺(tái)脫敏
// 原類(lèi) ch.qos.logback.core.ConsoleAppender // 替換類(lèi) pers.liuchengyin.logbackadvice.LcyConsoleAppender
②RollingFileAppender - 滾動(dòng)文件
// 原類(lèi) ch.qos.logback.core.rolling.RollingFileAppender // 替換類(lèi) pers.liuchengyin.logbackadvice.LcyRollingFileAppender
③FileAppender - 文件
// 原類(lèi) ch.qos.logback.core.rolling.RollingFileAppender // 替換類(lèi) pers.liuchengyin.logbackadvice.LcyRollingFileAppender
替換示例:
<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 控制臺(tái)輸出日志 --> <appender name="CONSOLE" class="pers.liuchengyin.logbackadvice.LcyConsoleAppender"> <encoder> <pattern> ${CONSOLE_LOG_PATTERN} </pattern> </encoder> </appender>
3、添加脫敏配置文件(logback-desensitize.yml)
該配置文件應(yīng)該放在resources文件下
脫敏規(guī)范
1、支持?jǐn)?shù)據(jù)類(lèi)型
八大基本類(lèi)型及其包裝類(lèi)型、Map、List、業(yè)務(wù)里的Pojo對(duì)象、List<業(yè)務(wù)里的Pojo對(duì)象>、JSON字符串。
注:在配置文件中配置的時(shí)候,只需要配置對(duì)象里的屬性值就行。
2、不支持的數(shù)據(jù)類(lèi)型
List<八大基本類(lèi)型及包裝類(lèi)型>,因?yàn)椴恢烂撁舻臄?shù)據(jù)源具體是哪一個(gè)。
3、匹配規(guī)則
key + 分割符 + value,目前僅支持冒號(hào)(:)和等號(hào)(=),示例如下:
log.info("your email:{}, your phone:{}", "123456789@qq.com","15310763497"); log.info("your email={}, your cellphone={}", "123456789@qq.com","15310763497");
key:定義了對(duì)應(yīng)需要脫敏的關(guān)鍵字,如上訴的email、phone等以及業(yè)務(wù)對(duì)象中的字段、Map中的Key、JSON中的Keyvalue:需要脫敏的值,如上訴的123456789@qq.com、15310763497。
4、日志規(guī)范
建議書(shū)寫(xiě)日志的時(shí)候盡量規(guī)范,對(duì)于key為中文的是沒(méi)有辦法脫敏的,規(guī)范程度可以見(jiàn)脫敏效果演示里的代碼。
logback-desensitize.yml配置說(shuō)明
# 日志脫敏 log-desensitize: # 是否忽略大小寫(xiě)匹配,默認(rèn)為true ignore: true # 是否開(kāi)啟脫敏,默認(rèn)為false open: true # pattern下的key/value為固定脫敏規(guī)則 pattern: # 郵箱 - @前第4-7位脫敏 email: "@>(4,7)" # qq郵箱 - @后1-3位脫敏 qqemail: "@<(1,3)" # 姓名 - 姓脫敏,如*杰倫 name: 1,1 # 密碼 - 所有需要完全脫敏的都可以使用內(nèi)置的password password: password patterns: # 身份證號(hào),key后面的字段都可以匹配以下規(guī)則(用逗號(hào)分隔) - key: identity,idcard # 定義規(guī)則的標(biāo)識(shí) custom: # defaultRegex表示使用組件內(nèi)置的規(guī)則:identity表示身份證號(hào) - 內(nèi)置的18/15位 - defaultRegex: identity position: 9,13 # 內(nèi)置的other表示如果其他規(guī)則都無(wú)法匹配到,則按該規(guī)則處理 - defaultRegex: other position: 9,10 # 電話(huà)號(hào)碼,key后面的字段都可以匹配以下規(guī)則(用逗號(hào)分隔) - key: phone,cellphone,mobile custom: # 手機(jī)號(hào) - 內(nèi)置的11位手機(jī)匹配規(guī)則 - defaultRegex: phone position: 4,7 # 自定義正則匹配表達(dá)式:座機(jī)號(hào)(帶區(qū)號(hào),號(hào)碼七位|八位) - customRegex: "^0[0-9]{2,3}-[0-9]{7,8}" # -后面的1-4位脫敏 position: "-<(1,4)" # 自定義正則匹配表達(dá)式:座機(jī)號(hào)(不帶區(qū)號(hào)) - customRegex: "^[0-9]{7,8}" position: 3,5 # 內(nèi)置的other表示如果其他規(guī)則都無(wú)法匹配到,則按該規(guī)則處理 - defaultRegex: other position: 1,3 # 這種方式不太推薦 - 一旦匹配不上,就不會(huì)脫敏 - key: localMobile custom: customRegex: "^0[0-9]{2,3}-[0-9]{7,8}" position: 1,3
上面這個(gè)配置是相對(duì)完整的,一定要嚴(yán)格遵守層級(jí)配置格式。
自定義脫敏支持的方式
1、key:value的方式
- phone:4,7,表示phone屬性的4-7位進(jìn)行脫敏
- 原始數(shù)據(jù):13610357861
- 脫敏后:136****7861
2、以符號(hào)作為起始、結(jié)束節(jié)點(diǎn)作為脫敏標(biāo)志
- emai:“@>(4,7)”,@為脫敏標(biāo)志,>表示其為結(jié)束節(jié)點(diǎn),<表示其為開(kāi)始節(jié)點(diǎn)。即@>表示對(duì)@之前的進(jìn)行脫敏,@<表示對(duì)@之后的進(jìn)行脫敏。這個(gè)示例就是@前的數(shù)據(jù)的第4-7位進(jìn)行脫敏。
注意:這種規(guī)則里的雙引號(hào)、括號(hào)不能省略,其次:和=不能作為標(biāo)志符號(hào),因?yàn)楹推ヅ湟?guī)則有沖突
- 原始數(shù)據(jù):123456789@qq.com
- "@>(4,7)"脫敏后:123****89@qq.com
- "@<(1,3)"脫敏后:123456789@***com
3、自定義正則脫敏
patterns: # 手機(jī)號(hào) - key: phone,mobile custom: # 手機(jī)號(hào)的正則 - customRegex: "^1[0-9]{10}" # 脫敏范圍 position: 4,7
customRegex:正則表達(dá)式,如果符合該表達(dá)式,則使用其對(duì)應(yīng)的脫敏規(guī)則(position)
4、一個(gè)字段,根據(jù)多種值含義進(jìn)行自定義脫敏
比如說(shuō),username字段的值可以是手機(jī)號(hào)、也可以是郵箱,這個(gè)值動(dòng)態(tài)改變的,前面幾種方式都沒(méi)辦法解決,可以使用該方式。
patterns: - key: username custom: # 手機(jī)號(hào) - 11位 - defaultRegex: phone position : 4,7 # 郵箱 - @ - defaultRegex: email position : "@>(3,12)" # 身份證 - 15/18位 - defaultRegex: identity position : 1,3 # 自定義正則 - customRegex: "^1[0-9]{10}" position : 1,3 # 都匹配不到時(shí),按照這種規(guī)則來(lái) - defaultRegex: other position : 1,3
注意:上面示例中匹配規(guī)則里的 雙引號(hào)和括號(hào) 都不能省略
該組件內(nèi)置四種匹配規(guī)則:手機(jī)號(hào)、身份證號(hào)、郵箱、other(其他匹配不到時(shí)用的),內(nèi)置一種脫敏方式:password,表示完全脫敏,可用于pattren下的。
注:當(dāng)pattern和patterns下的key有重復(fù)的時(shí)候,只會(huì)使用pattern下指定的方式進(jìn)行脫敏。
Jar包打入Maven本地倉(cāng)庫(kù)的方式
1、下載Jar包,放在一個(gè)文件夾里
2、在這個(gè)文件夾里打開(kāi)cmd(打開(kāi)cmd,進(jìn)入到這個(gè)文件夾)
3、執(zhí)行命令(前提保證maven配置正常,使用mvn -v命令查看是否正常,如果顯示版本號(hào)表示正常)
mvn install:install-file -DgroupId=pers.liuchengyin -DartifactId=logback-desensitization -Dversion=1.0.0 -Dpackaging=jar -Dfile=logback-desensitization-1.0.0.jar
命令說(shuō)明:
-DgroupId 表示jar對(duì)應(yīng)的groupId <groupId>pers.liuchengyin</groupId> -DartifactId: 表示jar對(duì)應(yīng)的artifactId <artifactId>logback-desensitization</artifactId> -Dversion 表示jar對(duì)應(yīng)的 version <version>1.0.0</version>
到此這篇關(guān)于Java的logback自定義日志脫敏組件詳解的文章就介紹到這了,更多相關(guān)logback自定義日志脫敏組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線(xiàn)程池代碼示例
線(xiàn)程池是管理線(xiàn)程的一個(gè)池子,通過(guò)阻塞隊(duì)列管理任務(wù),主要參數(shù)包括corePoolSize、maximumPoolSize、keepAliveTime等,這篇文章主要介紹了Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線(xiàn)程池的相關(guān)資料,需要的朋友可以參考下2024-09-09Java深入講解二十三種設(shè)計(jì)模式之中的策略模式
策略模式屬于Java 23種設(shè)計(jì)模式中行為模式之一,該模式定義了一系列算法,并將每個(gè)算法封裝起來(lái),使它們可以相互替換,且算法的變化不會(huì)影響使用算法的客戶(hù)。本文將通過(guò)示例詳細(xì)講解這一模式,需要的可以參考一下2022-05-05基于Java編寫(xiě)一個(gè)神奇的代碼恢復(fù)工具
這篇文章主要為大家詳細(xì)介紹了如何基于Java編寫(xiě)一個(gè)神奇的代碼恢復(fù)工具,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04詳解Java利用ExecutorService實(shí)現(xiàn)同步執(zhí)行大量線(xiàn)程
這篇文章主要介紹了Java利用ExecutorService實(shí)現(xiàn)同步執(zhí)行大量線(xiàn)程,ExecutorService可以維護(hù)我們的大量線(xiàn)程在操作臨界資源時(shí)的穩(wěn)定性。2017-03-03Java單例模式下的MongoDB數(shù)據(jù)庫(kù)操作工具類(lèi)
這篇文章主要介紹了Java單例模式下的MongoDB數(shù)據(jù)庫(kù)操作工具類(lèi),結(jié)合實(shí)例形式分析了java基于單例模式下操作MongoDB數(shù)據(jù)庫(kù)相關(guān)連接、查詢(xún)、插入、刪除等操作封裝技巧,需要的朋友可以參考下2018-01-01