先看现象。日志脱敏用 [A-Za-z0-9]+@[A-Za-z0-9.]+ 整段替换成 ***,user@company.com 的域名也一起没了,客服回访时找不到收件域。
这类报错背后常见的原因有几处,逐个排除就行。正则整段匹配后整体替换,没有分组保留域名。还有一种是带加号和下划线的地址匹配不全。
还有一种情况,大小写混写的域名没有被覆盖。
另外,没有为脱敏规则写单元测试。
上来先用几条样例验证匹配范围
python -c "import re;print(re.sub(r'[A-Za-z0-9]+@[A-Za-z0-9.]+','***','user@company.com'))"
随后改成保留域名的分组替换
python -c "import re;print(re.sub(r'[A-Za-z0-9._%+-]+@([A-Za-z0-9.-]+)',r'***@\1','user+tag@Company.com'))"
补上带加号和下划线的用例
python -c "import re;p=r'[A-Za-z0-9._%+-]+@([A-Za-z0-9.-]+)';print([re.sub(p,r'***@\1',s) for s in ['a_b@x.cn','a+b@y.com']])"
等前面都确认过,再把脱敏规则写进单测防回归
python -m pytest tests/test_mask.py -q
我习惯把每一步的执行时间和结果记在一边,后面复盘省事。
怎么算真的好了,看的是同一批现象。脱敏后地址变成 ***@company.com,域名保留,1000 条日志抽样里没有残留完整邮箱,单测全部通过。
容易忽略的是,脱敏要保留业务需要的部分,正则替换前先想清楚哪一段必须留下,分组是最小改动方式。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
