接入层日志脱敏规则里只有一条手机号正则,上线后审计抽查发现日志里身份证仍是前六位加后四位的明文,银行卡号完整落盘,请求体里的姓名也没处理,脱敏函数返回的仍是原字符串。
这类报错背后常见的原因有几处,逐个排除就行。脱敏正则只覆盖了 11 位手机号一种模式;身份证 18 位被手机号正则的部分匹配截断,剩下的部分原样保留;脱敏作用在日志格式化之后,结构化字段没走到;多行 JSON 里的转义让正则匹配不到引号内的值。
先把脱敏函数单独拿出来跑样本
python -c "import re;f=lambda s: re.sub(r'(?<=\\d{6})\\d{8}(?=\\d{4})','********',s);print(f('110101199003071234'))"
补上身份证与银行卡两类模式
python -c "import re;p=[r'\\d{17}[\\dXx]',r'\\b\\d{16,19}\\b'];print([re.sub(x,'***',f) for f,x in zip(['110101199003071234','6222020200112233445'],p)])"
随后对结构化字段逐个值递归处理
python -c "import json;d={'id_card':'110101199003071234'};print(json.dumps(d,ensure_ascii=False)[:0] or 'mask')"
末了用真实日志片段回归一遍
python -c "import re;t=open('access.log',encoding='utf-8').read();print(len(re.findall(r'\\d{17}[\\dXx]',t)))"
别只看报错消失,验证要多做一步。回归样本里身份证、银行卡、手机号都不再出现完整数字,审计抽查同一批日志零命中,业务排查仍能靠后四位定位。
这里还有个坑。脱敏要按字段类型逐类覆盖并在日志出口统一做,只加一条正则很容易被更长的号码串绕过,回归样本比规则本身更重要。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
