先看现象。日志脱敏用 [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 条日志抽样里没有残留完整邮箱,单测全部通过。

容易忽略的是,脱敏要保留业务需要的部分,正则替换前先想清楚哪一段必须留下,分组是最小改动方式。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189