温馨提示×

ubuntu nodejs日志为什么满

小樊
42
2026-09-27 17:00:21
栏目: 编程语言

在 Ubuntu 上 Node.js 日志“写满”(磁盘占满 / 日志文件巨大)通常由以下几类原因导致,你可以逐一排查:


一、最常见原因

1. 应用日志未做轮转(log rotation)

Node.js 服务如果直接:

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

或用了 console.log 重定向到文件:

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

而没有 日志轮转,时间一长日志就会无限增长。

✅ 解决:

  • 使用 logrotate
  • 或使用日志库(winston / pnpm / pm2 自带)

2. PM2 日志未清理(非常常见)

PM2 默认会把日志写在:

~/.pm2/logs/

包括:

  • app-out.log
  • app-error.log

如果不清理,很容易几 GB。

✅ 查看:

du -sh ~/.pm2/logs/*

✅ 清理:

pm2 flush

✅ 限制大小:

pm2 start app.js --max-size 10M --retain 7

3. 异常 / 死循环疯狂打日志

比如:

  • 请求异常被 catch 后 console.error 死循环
  • WebSocket 重连失败不停报错
  • 定时器里打日志

✅ 排查:

tail -n 1000 app.log

看是不是同样错误重复几万次


4. 未捕获异常 / 未处理 reject

例如:

promise.then(...) // 没 catch

Node 会打印 UnhandledPromiseRejection

✅ 解决:

process.on('unhandledRejection', e => {
  // 记录一次即可
})

二、系统层面原因

5. systemd journal 日志满(不是 Node 本身)

如果你用:

systemctl start node-app

journal 日志可能很大:

journalctl -u node-app

✅ 查看大小:

journalctl --disk-usage

✅ 清理:

journalctl --vacuum-size=100M

6. Docker 日志(如果你用容器)

Docker 默认不限制日志:

/var/lib/docker/containers/

✅ 查看:

docker ps --format "{{.Names}}"
du -sh /var/lib/docker/containers/*

✅ 解决:

  • 配置 log-driver
  • 限制 max-size

三、快速定位“是谁写满”

df -h
du -sh /* 2>/dev/null
du -sh /var/* 2>/dev/null
lsof | grep deleted

四、推荐的标准做法(生产环境)

✅ 使用:

  • winston + DailyRotateFile
  • PM2 + pm2 logs --lines 0
  • logrotate
  • 错误只记录一次,不循环打印

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

  • 你是怎么启动 Node 的(PM2 / systemd / docker / 裸跑)
  • 日志路径
  • 日志内容示例

我可以直接帮你定位是哪一类问题,并给出具体修复命令。

0 踩