VSCode默认不保存console.log输出,因其仅将stdout/stderr显示在终端或Debug Console,需通过Node.js进程内重定向(如fs.createWriteStream)或日志库(如pino)主动写入文件。

为什么 console.log 默认不写入文件
VSCode 本身不接管 Node.js 的标准输出流向,console.log 默认输出到终端(Terminal)或 Debug Console,不会自动落盘。想存到本地文件,得让 Node.js 进程自己把 stdout/stderr 重定向,或者用日志库接管输出逻辑。
用 process.stdout.write 重定向到文件(简单场景)
适合调试时快速抓日志,不依赖第三方库。核心是用 Node.js 的 fs.createWriteStream 替换 process.stdout:
const fs = require('fs');
const logStream = fs.createWriteStream('./app.log', { flags: 'a' });
process.stdout.write = logStream.write.bind(logStream);
process.stderr.write = logStream.write.bind(logStream);
console.log('这行会写入 app.log');
-
{ flags: 'a' }表示追加写入,避免每次覆盖 - 该方式会拦截所有
console.*和process.stdout.write()调用,但不影响debugger或 VSCode 的断点行为 - 注意:不能在 ES 模块(
.mjs或"type": "module")中直接替换process.stdout.write,会报TypeError: Cannot assign to read only property 'write'
用 pino 或 winston 写入文件(生产推荐)
更可靠、支持分级、异步写入、滚动归档。以轻量级的 pino 为例:
npm install pino
然后在入口文件中:
用于端到端视频本地化流程的轻量编排器,路由至四个专注子技能——/wjs-transcribing-audio、/wjs-translating-subtitles...
const pino = require('pino');
const logger = pino({
transport: {
target: 'pino/file',
options: { destination: './server.log' }
}
});
logger.info('服务已启动'); // 自动写入文件
-
pino/file是内置 transport,无需额外安装 - VSCode 的 Debug 模式下,日志仍会同时输出到 Debug Console(因为 pino 默认也写 stdout),如需关闭,加
level: 'silent'到 transport 配置 - 如果用
ts-node启动 TypeScript 项目,确保pino的 transport 在 CommonJS 环境下运行;ESM 中需改用import pino from 'pino'+target: 'pino-pretty'(开发)或target: 'pino/file'(生产,需配合node --loader ts-node/esm)
VSCode 的 launch.json 里加 console 配置没用
很多人试过在 .vscode/launch.json 里设置 "console": "integratedTerminal" 或 "externalTerminal",但这只控制调试器把输出“显示在哪”,不改变输出目标。Node.js 进程的 stdout 依然发给终端,而不是文件。
真正起作用的是进程内部的流重定向或日志库配置。VSCode 唯一能辅助的是:在 launch.json 中通过 env 注入环境变量,让日志库按需切换输出目标,比如:
"env": {
"LOG_TO_FILE": "1",
"LOG_PATH": "./debug.log"
}
然后在代码里判断:if (process.env.LOG_TO_FILE) logger.transport({ destination: process.env.LOG_PATH })。
文件路径是相对工作区根目录的,不是相对于 launch.json 所在位置,这点容易搞错。

















