温馨提示×

为何nodejs日志写满磁盘

小樊
47
2026-10-14 09:30:08
栏目: 编程语言

Node.js 日志写满磁盘,通常不是 Node.js 本身的问题,而是日志产生速度 > 磁盘清理速度或日志配置不当导致的。常见原因可以分为以下几类:


一、应用层日志过多(最常见)

1. 日志级别设置过低

  • 比如生产环境仍然使用 debug / verbose
  • 每个请求、每次函数调用都打日志
logger.debug('enter function', { req, user, payload })

✅ 建议:生产环境只用 info / warn / error


2. 在循环 / 高频接口中打印日志

例如:

  • WebSocket 每秒多次消息
  • 定时任务每秒执行
  • 高并发接口打印完整 body
setInterval(() => {
  logger.info('tick', bigObject)
}, 100)

日志量会被指数级放大。


3. 异常被 catch 后重复打印

try {
  ...
} catch (e) {
  logger.error(e)
  throw e // 外层又打一次
}

一个错误可能写 3~5 次日志。


二、日志库配置问题

4. 没有日志轮转(log rotate)

使用:

fs.appendFile('app.log', log)

❌ 永远不会切文件
✅ 应使用:

  • winston + winston-daily-rotate-file
  • pino + pino-roll
  • rotatelog

5. 日志文件未限制大小 / 数量

例如:

  • 只切日期,不限制保留天数
  • 保留 365 天日志

三、进程 / 系统层面问题

6. 标准输出(stdout)被重定向到文件

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

如果:

  • 没有 log rotate
  • 程序长期运行

app.out 会无限增长。


7. 子进程 / fork 重复写日志

  • cluster 模式
  • worker 都写同一个文件
  • pm2 日志 + 应用日志叠加

8. 磁盘被 core dump / 临时文件占满

不是“日志”但常被误认为日志:

  • core.*
  • /tmp
  • npm cache

四、第三方依赖在偷偷打日志

一些库会:

  • 打印 warning
  • 打印 deprecation
  • 打印 retry

例如:

  • axios
  • mongoose
  • redis

五、如何快速定位

1. 看是哪个文件占空间

du -sh /var/log/*
du -sh ~/.pm2/logs/*

2. 看实时增长

tail -f app.log
ls -lh app.log

3. 查 Node 进程

lsof | grep deleted

(可能有“已删除但仍在写”的日志文件)


六、推荐的正确做法 ✅

  • 使用 日志轮转
  • 生产环境关闭 debug
  • 日志只记“必要信息”
  • 错误日志结构化(JSON)
  • 配合监控(磁盘 / 日志大小告警)

如果你愿意,可以把:

  • 用的日志库
  • 启动方式(pm2 / docker / 裸跑)
  • 日志目录结构

发出来,我可以直接帮你判断是哪一种原因。

0 踩