在 Node.js 生产环境中,日志过大是常见问题,通常可以从 日志策略、存储方式、自动清理、日志拆分 四个方面来解决。下面给你一套实用方案。
常见原因:
console.log 太多推荐:
winston(最常用)pino(高性能,适合高并发)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' })
]
});
防止一个文件无限增长
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);
✅ 自动按天拆分
✅ 自动删除旧日志
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug'
避免:
debug❌ 错误示例:
logger.info(JSON.stringify(bigObject));
✅ 正确做法:
logger.info({
userId: user.id,
action: 'login'
});
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 logs -f 容器
✅ 推荐:
docker run \
--log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=3
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 限制日志大小
如果你愿意,可以告诉我:
我可以帮你 直接给出一份可复制的配置方案。