在 Debian 系统上,Node.js 日志把磁盘打满通常不是 Node.js 本身的问题,而是日志写入方式 + 系统/进程管理不当导致的。下面按常见原因从高到低说明,并给出对应解决办法。
Node.js 应用常使用:
console.logwinstonpinomorgan(HTTP 日志)如果直接写文件:
fs.appendFileSync('app.log', data)
而 没有 logrotate 配置,日志会无限增长。
✅ 解决:
sudo apt install logrotate
示例 /etc/logrotate.d/node-app:
/var/log/node-app/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
如果 Node.js 用 systemd 启动:
[Service]
ExecStart=/usr/bin/node app.js
日志会进 journald,可能撑爆 /var/log/journal
✅ 检查:
journalctl --disk-usage
✅ 限制大小:
sudo nano /etc/systemd/journald.conf
SystemMaxUse=500M
MaxRetentionSec=7day
sudo systemctl restart systemd-journald
例如:
node app.js > app.log 2>&1
或 Docker:
docker logs 容器名
如果没有清理机制,文件会持续增长。
✅ 解决:
pm2例如:
try {
doSomething()
} catch (e) {
console.error(e)
// 忘记 return / break
}
或:
setInterval(() => {
console.log('heartbeat')
}, 1)
✅ 排查:
lsof | grep node
du -sh /var/log/*
路径:
~/.npm/_logs/
✅ 清理:
npm cache clean --force
rm -rf ~/.npm/_logs/*
Docker 默认不限制日志:
/var/lib/docker/containers/*
✅ 限制:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
df -h
du -sh /var/log/*
journalctl --disk-usage
lsof | grep node
✅ 使用 pm2
pm2 start app.js
pm2 install pm2-logrotate
✅ 日志只输出到 stdout
✅ 用 logrotate 管理
✅ 限制 journald
✅ Docker 限制日志大小
如果你愿意,可以告诉我:
我可以直接帮你写 具体的修复配置。