温馨提示×

Ubuntu Nodejs日志为何过大

小樊
35
2026-08-05 09:53:49
栏目: 编程语言

在 Ubuntu 上 Node.js 日志过大,通常不是 Node.js 本身的问题,而是日志策略、运行方式或框架配置不当导致的。下面按常见原因 → 对应解决方案给你一个系统排查清单。


一、最常见原因

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

现象

  • /var/log~/.pm2/logs/app/logs 下日志文件不断变大
  • 服务器磁盘被吃满

原因

  • 日志一直追加,没有按大小或时间切割
  • 使用 pm2 / forever / docker 时尤其常见

解决方案

PM2 日志轮转

pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7

系统级 logrotate

sudo vim /etc/logrotate.d/node-app

示例:

/var/log/node/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

2️⃣ console.log / console.error 被滥用

现象

  • 日志里全是调试信息
  • 生产环境日志量巨大

原因

  • 开发时大量 console.log
  • 忘记关闭 debug 日志

解决方案

  • 禁止在生产环境使用 console.log
  • 使用日志库(winston / pino)
if (process.env.NODE_ENV === 'production') {
  console.log = () => {};
}

3️⃣ 使用 Winston / Pino 但配置不当

常见问题

  • 同时输出到 console + file
  • 没有限制日志级别
  • 没有设置文件大小

Winston 正确示例

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  transports: [
    new winston.transports.File({
      filename: 'app.log',
      maxsize: 10 * 1024 * 1024, // 10MB
      maxFiles: 5,
    }),
  ],
});

4️⃣ Node.js 崩溃导致重复日志

现象

  • 日志里大量重复错误
  • 应用不断重启

原因

  • 未捕获异常
  • Docker / PM2 自动重启后重复写日志

解决方案

process.on('uncaughtException', err => {
  logger.error('uncaughtException', err);
});

process.on('unhandledRejection', err => {
  logger.error('unhandledRejection', err);
});

5️⃣ Docker 容器日志未限制

现象

  • /var/lib/docker/containers 巨大

原因

  • Docker 默认 json-file 不限制大小

解决方案

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

然后重启 Docker。


6️⃣ Nginx / 反向代理日志过大

现象

  • Node 没写多少,但磁盘满了

原因

  • /var/log/nginx/access.log 太大

解决方案

sudo truncate -s 0 /var/log/nginx/access.log

并配置 nginx logrotate。


二、快速排查命令(强烈推荐)

查看哪个日志最大

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

查看实时日志增长

tail -f app.log

查看磁盘占用

df -h

三、推荐的生产日志方案 ✅

基本组合

  • PM2 + pm2-logrotate
  • Winston / Pino
  • 只记录 info / warn / error
  • 日志按天或大小切割
  • 定期清理 7~30 天前日志

四、如果你愿意,我可以进一步帮你

你可以直接贴出:

  1. 你用的是什么方式启动 Node(pm2 / docker / systemd)
  2. 日志路径
  3. 使用的日志库(如果有)

我可以 直接给你一份可复制的配置方案

0