概述
日志会落盘、被采集、被索引并长期保留。日志行中泄露的邮箱或令牌会绕过所有数据库访问控制。脱敏必须自动化并被测试覆盖,因为失败是静默的:应用照常工作,只有日志内容出了问题。
步骤
- 集中配置脱敏路径,让所有 logger 实例共享同一策略:
export const logger = pino({
redact: {
paths: ['req.headers.authorization', 'user.email',
'payment.card.number', 'err.context.email'],
censor: '[REDACTED]',
},
});
- 在测试中捕获序列化后的字符串,断言原始值不出现:
const output = lines.join('');
assert.equal(output.includes('[email protected]'), false);
assert.equal(output.includes('sk_live_abc123'), false);
- 在 CI 中增加针对日志样本的正则扫描,检查邮箱等常见 PII 形态。
- 故意删除一条脱敏路径运行测试,确认失败后再恢复。
验证
预期测试在脱敏生效时通过,删除路径后失败并指出泄露的值。CI 的 grep 门禁在样本包含邮箱时返回非零,样本清理后输出 no email patterns found。
注意事项
- 断言序列化后的字符串,而不是 logger 配置对象,回归通常发生在序列化阶段。
- 错误对象和自定义 serializer 最容易绕过脱敏,必须单独测试错误路径。
- 字段级脱敏无法覆盖自由文本消息,需要正则扫描作为第二层。
- 访问日志和崩溃上报也要使用同一策略,否则会抵消应用日志的脱敏效果。