Debian 上 Node.js 日志不输出通常不是 Node 本身的问题,而是运行方式、systemd、输出重定向或日志配置导致的。下面按最常见原因 → 排查方法 → 解决方案来说明。
systemd 启动时,stdout 没显示出来如果你是通过 systemd service 启动 Node.js:
[Service]
ExecStart=/usr/bin/node /app/server.js
✅ Node 的 console.log() 实际是输出到了 journald,而不是你当前终端。
查看方式:
journalctl -u your-service-name -f
✅ 解决(推荐):
StandardOutput=journal
StandardError=journal
或直接查看 journal。
在 非交互终端 下,Node 的 stdout 是 块缓冲,而不是行缓冲。
例如:
node app.js > log.txt
结果:
console.log() 不会立刻出现✅ 解决方式:
console.log('hello');
如果还是不行,加:
process.stdout.write('hello\n');
unref / 强制 flush(高级)process.stdout.write('hello\n');
process.stdout.emit('drain');
stdbuf(外部)stdbuf -oL node app.js
常见场景:
node app.js > out.log 2>&1
✅ 检查文件是否实时写入:
tail -f out.log
⚠️ 注意:
> 默认是 块缓冲tail -f 才能看到日志默认在:
~/.pm2/logs/
查看:
pm2 logs
docker logs -f 容器名
如果你用的是:
winstonpinobunyan可能配置了:
✅ 示例(winston):
logger.add(new transports.Console({
level: 'info'
}));
Node 是 异步退出 的:
console.log('exit');
setTimeout(() => {}, 100000);
✅ 解决:
process.exit(0);
建议你按顺序检查:
# 1. 是否真的在跑
ps aux | grep node
# 2. 是否是 systemd 启动
systemctl status your-service
# 3. stdout 去了哪
journalctl -u your-service -f
# 4. 是否重定向
ls -l /proc/<pid>/fd/1
你可以把下面信息贴出来,我可以精确告诉你是哪一条原因:
console.log 还是 winston 等)docker / ssh / cron只要贴出来,我可以直接给你最小修改方案。