温馨提示×

Nodejs日志为何占满Debian盘

小樊
40
2026-10-13 00:18:45
栏目: 编程语言

Node.js 日志把 Debian 磁盘占满,通常不是“Node 本身”的问题,而是日志没有被正确限制或轮转导致的。下面按最常见原因 → 排查方法 → 解决办法说明。


一、最常见原因(90% 情况)

1️⃣ 应用日志没有轮转(log rotate 未配置)

很多 Node 服务这么写:

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

或用了 winston / pino 但:

  • 没开 rotation
  • 没限制文件大小
  • 没限制保留天数

结果:

  • 一个 app.log 越来越大
  • 最后几十 GB

✅ 检查:

du -sh /var/www/*/logs/*
du -sh ~/project/logs/*

2️⃣ 标准输出(stdout)被 systemd 无限保存

如果你用 systemd 启动 Node:

[Service]
ExecStart=/usr/bin/node app.js

默认 journald 会存日志

journalctl -u your-node.service

如果没限制:

  • /var/log/journal 会爆炸

✅ 检查:

du -sh /var/log/journal

3️⃣ 错误堆栈 + 高频日志(死循环 / 异常)

比如:

setInterval(() => {
  console.error(err)
}, 1)

或:

  • 请求报错
  • 每请求一行日志
  • 流量一大直接写满

4️⃣ docker 容器日志没限制

如果你用 Docker 跑 Node:

docker logs container_name

默认:

  • json-file 驱动
  • 不限制大小

✅ 检查:

docker ps --size

5️⃣ 日志目录在根分区

Debian 默认:

  • /var
  • /home
  • /opt

都在 / 上

一旦日志暴涨 → 整个系统挂


二、快速排查命令(必用)

# 看哪个目录最大
du -h --max-depth=1 /

# 看 inode 是否耗尽(也很常见)
df -i

# 找大文件
find / -type f -size +100M

三、正确解决方案(推荐)

✅ 方案 1:Node 日志轮转(最重要)

使用:

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

示例(pino):

import pino from 'pino'
const logger = pino({
  transport: {
    target: 'pino-roll',
    options: { file: 'app.log', frequency: 'daily', size: '100M' }
  }
})

✅ 方案 2:systemd 限制 journal 日志

sudo nano /etc/systemd/journald.conf
SystemMaxUse=500M
MaxRetentionSec=7day

然后:

sudo systemctl restart systemd-journald

✅ 方案 3:Docker 限制日志

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

✅ 方案 4:Linux logrotate

sudo nano /etc/logrotate.d/node-app
/var/www/app/logs/*.log {
  daily
  rotate 7
  compress
  missingok
  notifempty
  copytruncate
}

四、临时救急(磁盘已满时)

# 找到大日志
find / -type f -name "*.log" -size +500M

# 清空(不要删)
: > /path/to/big.log

五、总结一句话

Node.js 日志占满 Debian 盘,不是 Node 的锅,而是“日志无上限 + 无轮转 + 无监控”。

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

  • 怎么启动 Node(systemd / pm2 / docker)
  • 用的日志库(winston / pino / console)

我可以直接给你一套可复制的配置。

0 踩