温馨提示×

nodejs linux日志为何过大

小樊
44
2026-10-05 12:47:15
栏目: 编程语言

在 Linux 上 Node.js 日志过大 通常不是 Node 本身的问题,而是日志写入方式 + 运行环境 + 配置造成的。下面按常见原因给你一个系统梳理。


一、最常见原因

1️⃣ 没有日志轮转(Log Rotation)

这是 90% 日志爆炸的根因。

  • 日志一直追加到同一个文件
  • 从不切割
  • 不压缩
  • 不删除

例如:

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

一个月后:

app.log  12G

✅ 解决:

  • 使用 logrotate
  • 或使用日志库自带 rotation(winston / pino)

2️⃣ 控制台日志太多(console.log)

Node 在生产环境常见错误:

console.log(req, res, user, token)

问题:

  • 打印了整个对象
  • 打印了请求体(含文件/base64)
  • 高并发下每秒几千行

✅ 建议:

  • 禁止 console.log
  • 使用结构化日志
  • 控制日志级别(error / warn)

3️⃣ 异常未被捕获,疯狂打印堆栈

例如:

setInterval(() => {
  doSomething() // 抛错
}, 10)

结果:

Error: xxx
    at ...
Error: xxx
    at ...

✅ 解决:

  • process.on('uncaughtException')
  • process.on('unhandledRejection')
  • 限制异常日志频率

4️⃣ 日志库配置不当

常见错误配置(winston 示例):

new transports.File({ filename: 'app.log' })

问题:

  • 没有 maxsize
  • 没有 maxFiles

✅ 正确示例:

new transports.File({
  filename: 'app.log',
  maxsize: 10 * 1024 * 1024,
  maxFiles: 5,
  tailable: true
})

5️⃣ 使用了 PM2 但没限制日志

PM2 默认:

~/.pm2/logs/app-out.log
~/.pm2/logs/app-error.log

如果不配置:

  • 永不清空
  • 多进程日志叠加

✅ 解决:

pm2 install pm2-logrotate

或:

pm2 start app.js --log-date-format "YYYY-MM-DD HH:mm:ss"

6️⃣ Docker / Kubernetes 日志未限制

在容器中:

  • stdout / stderr 被 docker 收集
  • 没有 log driver 限制

结果:

/var/lib/docker/containers/xxx/json.log 20G

✅ 解决:

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

7️⃣ 请求体 / 文件内容被记录

典型错误:

logger.info(req.body)

如果上传文件是 base64:

  • 一个请求 = 几 MB 日志

✅ 建议:

  • 只记录必要字段
  • 禁止记录 token / password / file

二、快速自查清单

# 看哪个日志最大
du -sh /var/log/*
du -sh ~/.pm2/logs/*

# 实时看增长速度
tail -f app.log

三、推荐生产方案(省心)

✅ 日志库

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

✅ 轮转

  • logrotate(系统级)
  • 或日志库自带

✅ 级别控制

if (process.env.NODE_ENV === 'production') {
  logger.level = 'warn'
}

四、如果你愿意

你可以直接贴:

  • 启动方式(node / pm2 / docker)
  • 用的日志库
  • 日志路径

我可以帮你 精准给出配置示例。

0 踩