Node.js 日志写满 Debian 磁盘,通常不是 Node 本身的问题,而是日志策略、运行方式或系统配置不当导致的。下面按“常见原因 → 排查方法 → 解决方案”来说明。
Node.js 服务(如 PM2、Docker、systemd)持续向同一个日志文件写日志,例如:
/var/log/myapp.log
~/.pm2/logs/app-out.log
时间久了就会把磁盘写满。
✅ 特征
PM2 默认不会自动清理日志,尤其是:
pm2 logspm2 start app.js日志会一直追加。
✅ 常见路径
~/.pm2/logs/
例如:
node app.js > app.log 2>&1
或 Docker:
docker logs 容器名
如果:
就会写满磁盘。
代码中:
setInterval(() => {
console.log('heartbeat')
}, 1)
或异常被 catch 后仍然疯狂 log。
✅ 特征
Docker 默认日志驱动是 json-file,不限制大小。
✅ 路径
/var/lib/docker/containers/
如果 Node 同时写:
会迅速占满磁盘。
df -h
du -h --max-depth=2 / | sort -hr | head -20
find / -type f -size +500M 2>/dev/null
~/.pm2/logs/
/var/log/
/var/lib/docker/containers/
pm2 install pm2-logrotate
常用配置:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
如果是 systemd 启动 Node:
[Service]
StandardOutput=journal
StandardError=journal
限制 journal 大小:
journalctl --vacuum-size=500M
或配置:
# /etc/systemd/journald.conf
SystemMaxUse=500M
修改 /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
然后重启 Docker。
console.log示例(winston):
const winston = require('winston')
const logger = winston.createLogger({
transports: [
new winston.transports.File({
filename: 'app.log',
maxsize: 10 * 1024 * 1024,
maxFiles: 5
})
]
})
# 清空大日志文件(不删文件)
: > 文件名.log
⚠️ 不建议长期依赖这种方式。
| 项目 | 建议 |
|---|---|
| 日志工具 | winston / pino |
| 日志轮转 | pm2-logrotate / logrotate |
| Docker | 限制 json-file |
| systemd | 限制 journal |
| 生产环境 | 禁止无限 console.log |
如果你愿意,可以告诉我:
我可以帮你给出精确修复方案。