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

Next.js中Pino v8.7.0日志级别显示标签而非数字的问题

解决Pino v8在Next.js客户端显示级别标签而非数字的问题

你的问题核心是级别格式化函数的参数签名错误,加上浏览器环境下的序列化配置需要调整,具体修复步骤如下:

1. 修正级别格式化函数的参数

Pino v8中,formatters.level的函数签名是(level: number, label: string) => object——第一个参数是级别数字(比如30对应info),第二个才是级别标签。你之前的代码把第一个参数当作label,导致返回的还是数字级别,完全没起到格式化作用。

2. 调整浏览器环境序列化配置

全局的serialize: true会让Pino自动序列化日志对象,可能覆盖格式化器的修改;同时浏览器端write函数接收的参数类型会受serialize设置影响,需要对应调整。

修复后的完整代码

import { default as Pino } from 'pino';

export const initLogger = () => {
  const pinoLogger = Pino({
    formatters: {
      // 正确接收level数字和label标签,返回标签替换数字
      level: (levelNum, label) => {
        return { level: label };
      }
    },
    browser: {
      // 关闭自动序列化,让格式化后的对象直接传递给write函数
      serialize: false,
      write: (logObj) => {
        // 自行序列化对象并打印
        console.log(JSON.stringify(logObj));
      }
    }
  });

  return pinoLogger;
};

验证效果

调用logger.info({ "name": "test"})后,输出会变为:

{"time":1666934438737,"level":"info","name":"test"}

额外说明

如果需要保留全局序列化配置,也可以在formatters.level中正确使用参数,但需确保浏览器端的write函数处理对应的数据类型。不过上面的方案是最直接有效的,既修正了参数错误,又适配了浏览器环境的日志输出逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:15:41