如何用正则替换指定前缀字符串?Spring Boot日志多字段脱敏实现
多字段日志脱敏的正则解决方案
嘿,这个场景我之前做Spring Boot项目时也碰到过,单字段替换确实满足不了多敏感字段的需求,用正则的分组+交替匹配就能轻松搞定!
核心配置示例
直接把你的logging.pattern.console改成下面这样,一次性覆盖所有需要脱敏的字段:
logging.pattern.console=%replace(%msg){'(password|credit_card_number|ccv|ssn)=[^&\\s]*', '$1=xxx'}%n
正则逻辑拆解
我给你拆解下这个正则的作用,方便你根据自己的日志格式调整:
(password|credit_card_number|ccv|ssn):用括号把所有需要脱敏的关键词包起来,|表示“或”,匹配任意一个指定关键词=:精准匹配关键词后面的等号[^&\\s]*:匹配等号后面的所有内容,直到遇到&(HTTP请求参数的分隔符)或者空白符(日志里的字段分隔)才停止,[^...]表示“不包含这些字符”,*表示匹配零个或多个字符$1=xxx:替换规则,$1会保留匹配到的原关键词(比如credit_card_number),然后把后面的值替换成xxx,这样日志里还能看到是哪个字段被脱敏了,方便后续排查问题
适配不同日志格式的小技巧
如果你的日志里键值对的分隔符不是&(比如用逗号、分号或者其他符号),只需要修改正则里的[^&\\s]部分就行:
- 比如用逗号分隔:把
[^&\\s]改成[^,\\s] - 如果是纯空格分隔:可以直接写成
[^\\s]*
要是你用的是YAML配置文件,注意转义的问题,用单引号包裹正则就不会有转义坑:
logging: pattern: console: "%replace(%msg){'(password|credit_card_number|ccv|ssn)=[^&\\s]*', '$1=xxx'}%n"
进阶:自定义脱敏规则(可选)
如果之后需要更精细的脱敏(比如银行卡号保留前4位后4位),可以调整替换的分组逻辑,比如:
logging.pattern.console=%replace(%msg){'(credit_card_number)=([0-9]{4})[0-9]*([0-9]{4})', '$1=$2****$3'}%n
这样日志里就会显示credit_card_number=1234****5678,既脱敏又保留了辨识度~
内容的提问来源于stack exchange,提问作者Nicole Naumann
相关产品推荐
相关产品推荐

