如何在Node.js中为console.log输出添加前缀?
解决console.log添加前缀且不破坏占位符的问题
你遇到的核心问题是直接修改每个参数会破坏console.log的占位符语法(比如%s),要解决这个问题,核心思路是先按原生console.log的规则把所有参数格式化成完整字符串,再给整个输出的每一行添加前缀,而不是逐个处理参数。
Node.js环境下的最优方案
Node.js的util模块提供了format方法,这正是console.log内部用来处理占位符的工具,结合inspect可以保留对象的颜色和完整结构:
import { format, inspect } from 'util'; export const log = (...args: unknown[]) => { // 对对象使用自定义inspect配置,保留颜色和完整深度 const processedArgs = args.map(arg => { if (typeof arg === 'object' && arg !== null) { return inspect(arg, { colors: true, depth: null }); } return arg; }); // 用原生规则格式化所有参数,包括占位符 const fullOutput = format(...processedArgs); // 给每一行添加前缀 const prefixedOutput = fullOutput.split('\n').map(line => `> ${line}`).join('\n'); console.log(prefixedOutput); };
这样调用log('foo %s', 123)会输出:
> foo 123
对于多行的对象输出,每一行都会带上前缀,同时保留原有的颜色和结构。
浏览器环境下的替代方案
浏览器没有util.format,可以用console.log的第一个参数支持样式的特性,快速给输出加前缀(缺点是多行输出的后续行不会带前缀,但占位符可以正常工作):
export const log = (...args) => { // 前缀加样式(可选,比如蓝色加粗),后面跟原参数 console.log('%c> ', 'color: #2196F3; font-weight: bold', ...args); };
调用log('foo %s', 123)会输出带蓝色加粗前缀的foo 123,占位符完全生效。
为什么你的原代码会出问题
原代码逐个处理参数时,把'foo %s'转成了'> foo %s',虽然占位符替换仍能生效,但提前把对象转成字符串会破坏console.log原生的对象展开能力;如果是多占位符场景,还可能导致参数与占位符的对应逻辑混乱。
内容的提问来源于stack exchange,提问作者Ada Boese
相关产品推荐
相关产品推荐

