如何设置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
相关产品推荐
相关产品推荐

