Pino Formatters与Serializers的区别及适用场景咨询
Pino JS中Formatters与Serializers的核心差异及适用场景
核心定位差异
Serializers:针对性处理单个对象的序列化
它专门负责处理日志里特定键名的顶级对象,把复杂对象转成符合要求的结构化JSON数据。比如默认自带的err序列化器,能把Error实例自动转成包含message、stack、code等字段的标准结构,避免直接输出Error对象出现乱码或关键信息缺失。
举个实际用法:
如果不想把用户对象的敏感字段(比如密码)输出到日志里,可以这样定义:
const logger = pino({ serializers: { user: (user) => ({id: user.id, nickname: user.nickname}) } })
之后只要写logger.info({user: currentUser}, '用户操作'),user字段就只会输出id和昵称,自动过滤敏感内容。
Formatters:全局调整整条日志的结构
它是用来改造日志的整体输出框架的,比如重命名默认字段、给所有日志统一添加全局上下文(比如服务名、运行环境)、调整默认元数据的格式。
举两个常见场景:
- 把默认的
level字段改成log_level:
const logger = pino({ formatters: { level: (levelLabel) => ({log_level: levelLabel}) } })
这样所有日志的级别字段都会从level变成log_level。
- 给每条日志统一添加服务标识:
const logger = pino({ formatters: { bindings: (bindings) => ({ ...bindings, service: 'user-service', env: process.env.NODE_ENV }) } })
这会让每条日志都带上service和env这两个全局字段。
适用场景总结
- 要处理特定业务对象的序列化(过滤敏感字段、标准化复杂对象) → 用Serializers
- 要统一修改日志的全局结构(重命名字段、添加全局上下文) → 用Formatters
另外需要注意:Serializers会先处理日志里的特定对象,之后Formatters再调整整条日志的结构,二者执行顺序明确,不会互相干扰。
内容的提问来源于stack exchange,提问作者Garrett Motzner
相关产品推荐
相关产品推荐

