在 Linux 上,Node.js 日志出现“延时”通常不是 Node.js 本身“慢”,而是标准输出被缓冲(buffering)或事件循环被阻塞导致的。下面按最常见 → 较少见的顺序说明原因和解决办法。
Node.js 里:
console.log() 立刻显示✅ 结果:
你看到日志“延迟几秒甚至几分钟才出现”。
process.stdout._handle?.setBlocking?.(true);
或(Node 18+):
import { stdout } from 'node:process';
stdout.setDefaultEncoding?.('utf8');
process.stdout.write(log + '\n');
process.stdout.flush?.();
unref() 自动刷新(高级)通常不需要。
常见原因:
JSON.parse() 大对象while(true)console.log('start');
heavySyncTask(); // 阻塞
console.log('end');
✅ 现象:
✅ 解决:
setImmediate / nextTicknew transports.Console({
handleExceptions: true,
flushInterval: 0
})
Pino 默认非 TTY 是缓冲的
✅ 解决:
NODE_ENV=production node app.js
或:
pino({ sync: true })
⚠️ 生产环境慎用 sync: true
systemd 不会实时 flush stdout
✅ 解决:
StandardOutput=journal+console
或:
--no-buffering
Docker 的 stdout 是 pipe,天然块缓冲
✅ 推荐:
docker run --tty
或强制刷新 stdout(见第一节)
fs.write / fs.createWriteStream✅ 解决:
fs.fsyncSync(fd);
或:
stream.end();
你可以按顺序确认:
Node.js 日志在 Linux 延时,90% 是 stdout 在非 TTY 下被块缓冲,或日志库默认缓冲导致。
如果你愿意,可以把:
贴出来,我可以直接给你最合适的配置方案。