Node.js 日志“突然不打印了”通常不是一个原因,而是输出方式、日志级别、进程状态、环境问题等叠加导致的。下面按最常见 → 较少见给你一个排查清单。
例如你用了:
node app.js > /dev/null 2>&1
或:
pm2 start app.js
PM2 默认不会直接输出到终端,而是写到日志文件。
✅ 解决:
pm2 logs
# 或
pm2 logs <app_name>
有人在代码里做了类似:
process.stdout.write = () => {};
process.stderr.write = () => {};
或某些库(测试框架、日志库、mock 工具)偷偷改了。
✅ 排查:
console.log(process.stdout.write.toString());
如果你用的是:
默认可能只打印 info 及以上。
logger.debug('xxx'); // 不打印
logger.info('xxx'); // 可以
✅ 解决:
logger.level = 'debug';
或:
const logger = winston.createLogger({
level: 'debug',
transports: [...]
});
进程异常退出但你看不出来。
✅ 排查:
ps -ef | grep node
或在代码里:
process.on('exit', () => console.log('process exit'));
process.on('uncaughtException', console.error);
process.on('SIGINT', () => console.log('SIGINT'));
Node.js stdout 是行缓冲的,如果你:
\n可能看不到。
✅ 建议:
console.log('msg\n');
或开启:
docker logs <container>
例如:
✅ 搜索代码:
grep -R "createLogger\|transports\|stream" .
比如:
setTimeout(() => {
console.log('xxx');
}, 1000);
但你在前面 process.exit() 了。
✅ 排查:
process.exit(0); // 是不是被调用了?
Node 里 console.log 基本可靠,但在:
可能丢。
例如:
NODE_ENV=production
有些日志库会自动提高级别。
✅ 临时验证:
NODE_ENV=development node app.js
你可以按顺序查:
你可以贴出:
我可以直接帮你定位是哪一行导致日志“消失”。