Node.js 日志写入缓慢通常不是单一原因,而是磁盘 I/O、日志方式、运行环境和代码写法共同作用的结果。下面从常见原因到排查思路系统说明。
很多日志库默认是同步写文件:
fs.writeFileSync('app.log', data);
writeFileSync、appendFileSync 会阻塞 Node.js 主线程✅ 解决:
例如:
logger.debug('xxx')
logger.trace('xxx')
✅ 解决:
info 或 warn错误示例:
fs.createWriteStream('a.log', { flags: 'a' })
每次写日志都创建新 stream,或反复 open/close。
✅ 解决:
iowait 很高)✅ 检查:
iostat -x 1
或:
df -h
✅ 解决:
logrotateconsole.log()
问题:
console.log 在某些场景是同步的✅ 解决:
console.logNode.js 是单线程:
都可能阻塞事件循环。
✅ 排查:
node --trace-event-categories node.async_hooks
或监控:
setInterval(() => {
const start = Date.now()
setImmediate(() => {
console.log('loop delay', Date.now() - start)
})
}, 1000)
logger.info(JSON.stringify(bigObject))
✅ 解决:
✅ Pino(最快)
const pino = require('pino')
const logger = pino({ level: 'info' })
✅ Winston(注意 transport)
new winston.transports.File({
filename: 'app.log',
options: { flags: 'a' }
})
避免:
new winston.transports.Console()
在线上环境。
✅ 解决:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
writeFileSyncconsole.logNode.js 日志慢,90% 是“同步写磁盘 + 日志太多 + 文件方式不对”导致的。
如果你愿意,可以把:
发出来,我可以帮你精确定位是哪一类问题。