温馨提示×

Nodejs日志为何写满Debian磁盘

小樊
43
2026-07-13 03:55:10
栏目: 编程语言

Node.js 日志写满 Debian 磁盘,通常不是 Node 本身的问题,而是日志策略、运行方式或系统配置不当导致的。下面按“常见原因 → 排查方法 → 解决方案”来说明。


一、常见原因

1. 应用日志没有轮转(最常见)

Node.js 服务(如 PM2、Docker、systemd)持续向同一个日志文件写日志,例如:

/var/log/myapp.log
~/.pm2/logs/app-out.log

时间久了就会把磁盘写满。

特征

  • 单个日志文件非常大(几 GB)
  • 磁盘使用率 100%
  • 重启服务后短暂恢复

2. PM2 默认日志不限制大小

PM2 默认不会自动清理日志,尤其是:

  • pm2 logs
  • pm2 start app.js

日志会一直追加。

常见路径

~/.pm2/logs/

3. 标准输出 / 标准错误被重定向

例如:

node app.js > app.log 2>&1

或 Docker:

docker logs 容器名

如果:

  • 没有日志轮转
  • 控制台输出过多

就会写满磁盘。


4. 异常或死循环不断写日志

代码中:

setInterval(() => {
  console.log('heartbeat')
}, 1)

或异常被 catch 后仍然疯狂 log。

特征

  • 日志增长速度极快
  • CPU 使用率也高

5. 日志目录在 Docker / 容器环境中

Docker 默认日志驱动是 json-file,不限制大小。

路径

/var/lib/docker/containers/

6. Debian 系统日志 + Node 日志叠加

如果 Node 同时写:

  • 应用日志
  • systemd journal
  • nginx / pm2 / docker 日志

会迅速占满磁盘。


二、快速排查(Debian)

1️⃣ 查看磁盘占用

df -h

2️⃣ 找出最大的目录

du -h --max-depth=2 / | sort -hr | head -20

3️⃣ 找出大文件

find / -type f -size +500M 2>/dev/null

4️⃣ 常见重点目录

~/.pm2/logs/
/var/log/
/var/lib/docker/containers/

三、解决方案

✅ 1. 使用日志轮转(强烈推荐)

PM2 日志轮转

pm2 install pm2-logrotate

常用配置:

pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true

✅ 2. systemd 服务日志限制

如果是 systemd 启动 Node:

[Service]
StandardOutput=journal
StandardError=journal

限制 journal 大小:

journalctl --vacuum-size=500M

或配置:

# /etc/systemd/journald.conf
SystemMaxUse=500M

✅ 3. Docker 日志限制

修改 /etc/docker/daemon.json

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}

然后重启 Docker。


✅ 4. Node.js 本身优化

  • 不要无限 console.log
  • 使用日志库(winston / pino)
  • 按级别输出日志

示例(winston):

const winston = require('winston')

const logger = winston.createLogger({
  transports: [
    new winston.transports.File({
      filename: 'app.log',
      maxsize: 10 * 1024 * 1024,
      maxFiles: 5
    })
  ]
})

✅ 5. 临时清理(应急)

# 清空大日志文件(不删文件)
: > 文件名.log

⚠️ 不建议长期依赖这种方式。


四、推荐的最佳实践 ✅

项目 建议
日志工具 winston / pino
日志轮转 pm2-logrotate / logrotate
Docker 限制 json-file
systemd 限制 journal
生产环境 禁止无限 console.log

如果你愿意,可以告诉我:

  • 你是 PM2 / Docker / systemd 哪种方式运行?
  • Debian 版本
  • 磁盘被哪个目录占满

我可以帮你给出精确修复方案

0