温馨提示×

Nodejs日志为何不打印了

小樊
45
2026-08-17 18:03:25
栏目: 编程语言

Node.js 日志“突然不打印了”通常不是一个原因,而是输出方式、日志级别、进程状态、环境问题等叠加导致的。下面按最常见 → 较少见给你一个排查清单。


一、最常见原因(90% 都在这里)

1️⃣ 日志被重定向 / 吞掉了

例如你用了:

node app.js > /dev/null 2>&1

或:

pm2 start app.js

PM2 默认不会直接输出到终端,而是写到日志文件。

✅ 解决:

pm2 logs
# 或
pm2 logs <app_name>

2️⃣ stdout / stderr 被别人改了

有人在代码里做了类似:

process.stdout.write = () => {};
process.stderr.write = () => {};

或某些库(测试框架、日志库、mock 工具)偷偷改了。

✅ 排查:

console.log(process.stdout.write.toString());

3️⃣ 日志级别被限制

如果你用的是:

  • winston
  • pino
  • log4js
  • bunyan

默认可能只打印 info 及以上。

logger.debug('xxx'); // 不打印
logger.info('xxx');  // 可以

✅ 解决:

logger.level = 'debug';

或:

const logger = winston.createLogger({
  level: 'debug',
  transports: [...]
});

4️⃣ 进程挂了 / 没在跑

进程异常退出但你看不出来。

✅ 排查:

ps -ef | grep node

或在代码里:

process.on('exit', () => console.log('process exit'));
process.on('uncaughtException', console.error);
process.on('SIGINT', () => console.log('SIGINT'));

二、Docker / 容器常见问题

5️⃣ Docker 日志没 flush

Node.js stdout 是行缓冲的,如果你:

  • 没有换行 \n
  • 进程直接被 kill

可能看不到。

✅ 建议:

console.log('msg\n');

或开启:

docker logs <container>

6️⃣ 日志跑到“其他地方”了

例如:

  • 写文件了
  • 发到 ELK / 远端了
  • 被日志库过滤掉了

✅ 搜索代码:

grep -R "createLogger\|transports\|stream" .

三、异步 / 事件循环问题

7️⃣ 程序提前退出

比如:

setTimeout(() => {
  console.log('xxx');
}, 1000);

但你在前面 process.exit() 了。

✅ 排查:

process.exit(0); // 是不是被调用了?

8️⃣ console.log 本身是异步的(极端情况)

Node 里 console.log 基本可靠,但在:

  • 高并发
  • 自定义 writable stream
  • mock 测试环境

可能丢。


四、环境问题

9️⃣ 环境变量影响

例如:

NODE_ENV=production

有些日志库会自动提高级别。

✅ 临时验证:

NODE_ENV=development node app.js

五、快速自检 Checklist ✅

你可以按顺序查:

  1. ✅ 是否还在运行?
  2. ✅ 是否 pm2 / docker / 重定向?
  3. ✅ 是否是 debug / info 级别?
  4. ✅ stdout 是否被重写?
  5. ✅ 是否有 uncaughtException 没捕获?
  6. ✅ 是否真的执行到那一行?

六、如果你愿意,我可以精确定位

你可以贴出:

  • Node 版本
  • 是否使用 winston / pino 等日志库
  • 启动方式(直接 node、pm2、docker)
  • 不打印的那段代码

我可以直接帮你定位是哪一行导致日志“消失”。

0