如何用Pino Logger仅展示REST API请求中的单个请求头
解决Pino保留指定请求头的简洁方案
不用重写整个请求序列化器,有两种更高效的实现方式:
方法一:利用Redact的排除规则
Pino的redact配置支持通过!前缀标记需要保留的字段,能在全局脱敏请求头的同时,单独放行指定的transaction头:
const logger = pino({ redact: [ "req.headers", // 脱敏所有请求头 "!req.headers.transaction", // 排除transaction头,不做脱敏 "res.headers" // 脱敏响应头 ] })
这种方式直接复用Pino默认的请求序列化逻辑,完全不用自定义req序列化器,是最简洁的实现方式。
方法二:自定义Redact函数(适配复杂场景)
如果需要对保留字段做额外处理(比如格式校验、内容转换),可以用自定义redact函数:
const logger = pino({ redact: { paths: ["req.headers", "res.headers"], remove: false, // 保留headers对象结构,仅脱敏指定外的字段 redact: (path, value) => { if (path === "req.headers") { // 仅保留transaction字段,其他请求头替换为脱敏标记 return Object.fromEntries( Object.entries(value).map(([key, val]) => key === "transaction" ? [key, val] : [key, "***"] ) ) } // 其他路径按默认规则脱敏 return "***" } } })
关键说明
两种方式都能自动保留Pino默认输出的req.id、method、url、remoteAddress、remotePort等字段,无需手动重新定义。
内容的提问来源于stack exchange,提问作者Julio Martínez
相关产品推荐
相关产品推荐

