如何在Fastify的Pino日志中脱敏查询字符串参数
解决方案
以下是两种可直接落地的实现方式,均可实现仅脱敏URL中指定查询参数、保留其余内容正常输出的需求:
方式1:使用Pino内置自定义脱敏函数(推荐)
Fastify初始化时直接配置logger的redact选项,对url字段做正则替换即可,不会侵入业务逻辑、也不会修改原始请求参数:
const fastify = require('fastify')({ logger: { level: 'info', redact: { paths: ['url'], // 自定义脱敏逻辑 redactFunction: (value) => { if (typeof value !== 'string') return value // 正则匹配指定参数,仅替换取值部分 return value.replace(/([?&]token=)[^&]+/g, '$1***') } } } })
扩展说明:如果需要同时脱敏password、secret等多个敏感参数,只需修改正则为/([?&](token|password|secret)=)[^&]+/g即可
方式2:通过Fastify请求钩子统一处理
如果需要对全链路的请求URL做脱敏(比如其他业务中间件也会打印URL日志),可以在请求前置钩子中处理:
fastify.addHook('onRequest', (req, reply, done) => { if (req.url.includes('?')) { // 注意:如果业务后续需要用到原始完整URL,不要直接修改req.raw.url // 可将脱敏后的URL存入自定义字段如req.sanitizedUrl,再配置Pino输出该字段即可 req.raw.url = req.raw.url.replace(/([?&]token=)[^&]+/g, '$1***') } done() })
内容的提问来源于stack exchange,提问作者Ben Davis
相关产品推荐
相关产品推荐

