如何配置pino-pretty使日志特殊字符按字面量输出?
解决Pino + pino-pretty特殊字符转义显示问题
问题原因
Pino序列化日志对象时,会自动把字符串里的\n、\t这类特殊字符转义成JSON兼容的\\n、\\t;而pino-pretty默认保留这种转义格式,所以你看到的是转义序列而非实际的换行和空格。你之前在日志前做的字符串替换无效,是因为Pino序列化时又把转义字符重新加回去了。
解决方案
通过pino-pretty的formatters配置,自定义日志字段的格式化逻辑,在pino-pretty处理阶段直接解析转义字符:
const pinoLogger = pino({ name: logger, level: LogLevel.DEBUG, transport: { target: 'pino-pretty', options: { destination: 1, colorize: true, translationTime: "SYS:yyyy-mm-dd'T'HH:MM:ss.l", formatters: { log: (logObj) => { // 针对目标字段(比如value)解析转义字符 if (logObj.value) { // 把\t替换为4个空格,\\n替换为实际换行 logObj.value = logObj.value.replace(/\\t/g, ' ') .replace(/\\n/g, '\n'); } return logObj; } } } } });
补充说明
- 若需要处理多个字段,只需在
log格式化函数中添加对应字段的处理逻辑即可。 - 确保你的pino-pretty版本为v10及以上,旧版本可能不支持
formatters.log配置项。 - 不建议全局关闭Pino的转义功能(如设置
safe: false),这会导致日志输出不符合JSON规范,在不使用pino-pretty时出现异常。
内容的提问来源于stack exchange,提问作者Ethan Jones
相关产品推荐
相关产品推荐

