温馨提示×

为何nodejs日志占满磁盘

小樊
48
2026-09-09 13:04:53
栏目: 编程语言

Node.js 服务日志占满磁盘,通常不是 Node.js 本身的问题,而是日志产生方式 + 运维策略缺失共同导致的。下面按「常见原因 → 原理 → 解决建议」来说明。


一、最常见原因

1. 未做日志轮转(Log Rotation)

这是头号原因

  • 日志一直写同一个文件(如 app.log
  • 文件只增不减
  • 几天 / 几周后直接占满磁盘

✅ 表现:

  • 单个日志文件几十 GB
  • 磁盘 100%
  • 服务还能跑,但系统卡死

✅ 解决:

  • Linux:logrotate
  • Node:winston + winston-daily-rotate-file
  • PM2:pm2 logrotate

2. 控制台日志被重定向到文件

例如:

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

或 Docker:

docker logs -f > app.log

✅ 问题:

  • stdout / stderr 无限增长
  • 没有上限控制

✅ 解决:

  • 不要长期重定向
  • 用日志库而不是 console.log

3. 异常 / 错误被疯狂打印

例如:

setInterval(() => {
  try {
    doSomething()
  } catch (e) {
    console.error(e)
  }
}, 10)

✅ 结果:

  • 每秒几百次错误
  • 日志爆炸

✅ 解决:

  • 错误限流
  • 只记录关键错误
  • 避免打印完整 stack 到生产

4. 调试日志忘记关

开发时:

logger.debug('req =>', req)

生产环境:

  • 忘了关 debug
  • 每次请求都打大量数据

✅ 解决:

  • 用日志级别(info / warn / error)
  • 生产只开 info+

5. Docker / 容器日志未限制

Docker 默认:

json-file 驱动
不限制大小

✅ 结果:

  • /var/lib/docker 被撑爆

✅ 解决(docker-compose):

logging:
  driver: "json-file"
  options:
    max-size: "50m"
    max-file: "3"

6. 内存溢出 / 崩溃循环

例如:

  • 服务不断重启
  • 每次启动都 dump 大日志

✅ 解决:

  • 限制重启次数
  • 检查 OOM 原因

二、Node.js 特有注意点

1. console.log 是同步阻塞的

  • 高并发下非常慢
  • 容易堆积日志

✅ 建议:

  • pino / winston

2. 未捕获异常

process.on('uncaughtException', e => {
  console.log(e)
})

✅ 风险:

  • 反复触发
  • 日志疯涨

三、快速排查清单 ✅

# 看谁占磁盘
du -sh /* 2>/dev/null

# 看日志文件
ls -lh /var/log
du -sh /var/log/*

# Docker
docker system df

四、推荐生产方案 ✅

日志库

  • pino(最快)
  • winston(灵活)

日志策略

  • 按天 / 大小切割
  • 保留 7–30 天
  • 错误限流
  • 不上 debug

五、一句话总结

Node.js 日志占满磁盘,99% 是因为**“只写不切 + 不限制 + 错误狂打”**。

如果你愿意,可以:

  • 贴日志配置
  • 说运行环境(Docker / PM2 / 裸机)
  • 说日志库

我可以直接帮你给出可落地的配置方案

0