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

如何设置Pino日志的字段显示顺序

Pino日志字段自定义排序方案

要调整Pino日志的字段顺序,让指定字段排在最前面,可以通过自定义序列化器或格式化器实现,利用ES2015+中JSON.stringify保留对象插入顺序的特性来控制输出顺序。

方法一:自定义根序列化器

在创建Pino实例时,通过serializers.root手动构造有序的日志对象:

const pino = require('pino');

const logger = pino({
  serializers: {
    root(obj) {
      // 定义需要前置的核心字段
      const priorityFields = ['level', 'status', 'msg', 'route', 'details'];
      // 过滤出剩余字段
      const restFields = Object.keys(obj).filter(key => !priorityFields.includes(key));
      
      const orderedLog = {};
      // 先添加核心字段
      priorityFields.forEach(key => {
        if (obj[key] !== undefined) {
          orderedLog[key] = obj[key];
        }
      });
      // 再添加剩余字段
      restFields.forEach(key => {
        orderedLog[key] = obj[key];
      });
      
      return orderedLog;
    }
  }
});

方法二:使用formatters格式化日志对象

如果不需要单独处理不同类型的序列化(如request、error),可以直接用formatters.log统一处理:

const pino = require('pino');

const logger = pino({
  formatters: {
    log(obj) {
      const priorityFields = ['level', 'status', 'msg', 'route', 'details'];
      const orderedLog = {};
      
      priorityFields.forEach(key => obj[key] !== undefined && (orderedLog[key] = obj[key]));
      Object.keys(obj).forEach(key => !priorityFields.includes(key) && (orderedLog[key] = obj[key]));
      
      return orderedLog;
    }
  }
});

配合pino-pretty使用

如果用pino-pretty做格式化输出,只需将上述配置与transport选项结合即可,字段顺序会被保留:

const logger = pino({
  formatters: {
    log(obj) {
      const priorityFields = ['level', 'status', 'msg', 'route', 'details'];
      const orderedLog = {};
      
      priorityFields.forEach(key => obj[key] !== undefined && (orderedLog[key] = obj[key]));
      Object.keys(obj).forEach(key => !priorityFields.includes(key) && (orderedLog[key] = obj[key]));
      
      return orderedLog;
    }
  },
  transport: {
    target: 'pino-pretty',
    options: {
      colorize: true,
      translateTime: 'SYS:yyyy-mm-dd HH:MM:ss.l'
    }
  }
});

配置完成后,日志输出的JSON会严格按照你指定的顺序排列:核心字段level、status、msg、route、details排在最前,time、version、requestid等字段紧随其后。

内容的提问来源于stack exchange,提问作者Pavel Husakouski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:02:50