问题出现得很突然,日志倒是留得挺全。访问日志里 Authorization 头会整段打印,之前加的正则只匹配 sk- 开头 48 位的串。最近换了一个 20 位、前缀是 ik- 的内部 key,日志里原样出现了。抽了 200MB 日志查出 37 条明文,环境是 Python 3.11 的 logging 加 loguru 0.7 双通道。
刚开始盯着「第三方库自己打日志,没走统一的 formatter」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。正则只覆盖一种前缀和固定长度,换个格式就漏。少数情况下是脱敏加在输出之后,异常栈绕过了过滤器。
不容易想到的是,请求体里的 body 也带 key,只处理了 header。
动手时先在日志里确认还有哪些形态没被覆盖
Select-String -Path logs\app.log -Pattern 'ik-|sk-|Bearer' | Select-Object -First 5
然后把规则改成按键名匹配不依赖前缀长度
python -c "import re;print(re.sub(r'(?i)(authorization|api_key)=([^\s]+)',r'\1=***','authorization=ik-abc123'))"
接着在 logging 过滤器里统一处理并覆盖异常栈
python -c "import logging;print(logging.getLogger('app').filters)"
等前面都确认过,再用历史日志回放验证脱敏覆盖率
python mask_check.py --file logs/app.log --rules rules.json --out hit.csv
改完先别撤,确认这几项。回放同一份日志明文命中数为 0,格式化后的异常栈里 key 显示为星号,新日志抽样 500 行没有残留。
这里还有个坑。脱敏要按键名和引用来匹配,别依赖前缀和长度;过滤器放在 formatter 之前,否则异常栈和子 logger 都会漏。这类问题最好一次改到位,反复小改反而容易把原因搅混。
