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
相关产品推荐
相关产品推荐

