温馨提示×

Nodejs日志过大怎么办

小樊
46
2026-08-02 14:31:12
栏目: 编程语言

Node.js 生产环境中,日志过大是常见问题,通常可以从 日志策略、存储方式、自动清理、日志拆分 四个方面来解决。下面给你一套实用方案。


一、先判断日志大的原因

常见原因:

  • 控制台 console.log 太多
  • 未限制日志级别(debug / info 全开)
  • 日志未轮转(一直写同一个文件)
  • 异常堆栈、请求体、大对象直接写日志
  • Docker / PM2 把 stdout 写进文件

二、推荐方案(按优先级)

✅ 1. 使用成熟日志库(不要 console.log)

推荐:

  • winston(最常用)
  • pino(高性能,适合高并发)

Winston 示例

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info', // 生产环境建议 info 或 warn
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

✅ 2. 日志轮转(最重要)

防止一个文件无限增长

方案 A:winston + winston-daily-rotate-file(推荐)

npm install winston-daily-rotate-file
const DailyRotateFile = require('winston-daily-rotate-file');

const transport = new DailyRotateFile({
  filename: 'logs/app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxSize: '20m',      // 单个文件最大
  maxFiles: '14d'      // 保留 14 天
});

logger.add(transport);

✅ 自动按天拆分
✅ 自动删除旧日志


✅ 3. 控制日志级别

level: process.env.NODE_ENV === 'production' ? 'info' : 'debug'

避免:

  • 生产环境开 debug
  • 打印整个 req.body / 大 JSON

✅ 4. 避免“日志炸弹”

❌ 错误示例:

logger.info(JSON.stringify(bigObject));

✅ 正确做法:

logger.info({
  userId: user.id,
  action: 'login'
});

三、PM2 / Docker 场景

PM2

PM2 会记录 stdout,容易爆盘

✅ 方案:

pm2 install pm2-logrotate

配置:

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

直接关闭 PM2 日志

"out_file": "/dev/null",
"error_file": "/dev/null"

Docker

❌ 不要:

docker logs -f 容器

✅ 推荐:

  • 日志输出到 stdout
  • 使用 log driver 限制大小
docker run \
--log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=3

四、系统级清理(兜底方案)

Linux 查找大日志

du -sh /var/log/*
find . -name "*.log" -size +100M

手动清理

truncate -s 0 app.log

五、推荐生产配置(总结)

✅ 使用 winston + daily-rotate-file
✅ 日志级别:info / warn / error
✅ 单文件 ≤ 20MB
✅ 保留 7~14 天
✅ 不打印大对象
✅ PM2 / Docker 限制日志大小


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

  • 用的是 PM2 / Docker / 原生 node
  • 当前日志是 文件 / stdout
  • 日增量大概多少

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

0