
Pino 默认以纯文本 JSON 格式输出对象,不带颜色;本文介绍通过集成 json-colorizer 库,为 logger.info() 等方法中打印的对象自动添加语法高亮,提升开发调试体验。
本文介绍通过集成 json-colorizer 库,为 logger.info() 等方法中打印的对象自动添加语法高亮,提升开发调试体验。
Pino 是一个高性能、极简的 Node.js 日志库,其默认输出为紧凑、无格式的 JSON 字符串(如 {"a":"a","level":30,"time":1718234567890,"pid":1234,"hostname":"localhost"}),虽利于结构化解析,但在本地开发终端中缺乏可读性——尤其是嵌套对象或长日志时,缺少颜色区分字段名、字符串、数字、布尔值等类型。
幸运的是,我们无需修改 Pino 核心行为,即可优雅增强控制台可视化效果。推荐方案是使用轻量级库 json-colorizer,它专为安全、同步地美化 JSON 字符串而设计,支持 ANSI 颜色编码,且不依赖 DOM 或复杂运行时。
✅ 快速集成步骤如下:
-
安装依赖:
npm install json-colorizer
-
引入并封装增强型日志方法(以
debug为例,可按需扩展至info/warn等):const pino = require('pino'); const colorize = require('json-colorizer');
const logger = pino({ transport: { target: 'pino-pretty', // 可选:若已用 pino-pretty,优先启用它(见下方说明) options: { colorize: true } } });
// 自定义 debug 方法:对对象参数自动 colorize,其余保持原语义
const debug = function (obj, ...args) {
if (obj && typeof obj === 'object' && !Array.isArray(obj) && obj.constructor === Object) {
// 仅对 plain object 进行 colorize(避免序列化 error、Date 等)
const jsonStr = JSON.stringify(obj, null, 2);
logger.debug(${args.length ? args.join(' ') + ' ' : ''}${colorize(jsonStr)});
} else {
logger.debug(obj, ...args);
}
};
logger.debug = debug.bind(logger);
3. 使用示例:
```js
logger.debug({ a: 'a', b: 42, c: true, nested: { x: [1, 2] } });
// 终端将显示带颜色的缩进 JSON:key 为黄色,string 为绿色,number 为蓝色,boolean 为洋红色等
⚠️ 注意事项与建议:
-
json-colorizer不处理undefined、函数、循环引用或Date/RegExp等非标准 JSON 类型;建议预处理或改用JSON.stringify(obj, null, 2)后再 colorize,确保输入安全。 - 若你已在使用
pino-pretty(官方推荐的美化传输器),请优先启用其内置 color 支持(如上配置所示),它比手动 colorize 更健壮、支持日志级别图标、时间格式化等,且天然兼容所有 Pino 输出。仅当无法使用 transport 时,才采用本文的手动方案。 - 生产环境务必禁用颜色输出(设置
NODE_ENV=production或显式关闭colorize: false),避免干扰日志采集系统(如 ELK、Datadog)对 JSON 的解析。
? 总结:颜色不是日志的必需品,但却是开发者效率的加速器。通过少量封装,即可让 Pino 在开发阶段“看得更清”,又不影响生产稳定性——这正是现代日志工具链应有的灵活性。










