You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:全局调整整条日志的结构

它是用来改造日志的整体输出框架的,比如重命名默认字段、给所有日志统一添加全局上下文(比如服务名、运行环境)、调整默认元数据的格式。

举两个常见场景:

  1. 把默认的level字段改成log_level:
const logger = pino({
  formatters: {
    level: (levelLabel) => ({log_level: levelLabel})
  }
})

这样所有日志的级别字段都会从level变成log_level。

  1. 给每条日志统一添加服务标识:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:22:51