在 Linux 下 Node.js 日志过大,通常可以从日志生成控制、日志轮转、日志清理、存储与监控几个方面解决。下面按实用程度给你一套方案。
常见日志过大的原因:
console.log / console.error 输出太多先看日志在哪:
du -sh /var/log/*
du -sh ~/your-project/logs/*
logrotate(Linux 原生)适合直接写文件的 Node 日志。
示例配置 /etc/logrotate.d/node-app:
/var/log/node-app/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
}
说明:
daily:每天切rotate 7:保留 7 份compress:压缩旧日志copytruncate:不重启 Node 也能切日志(很重要)应用后测试:
logrotate -d /etc/logrotate.d/node-app
winstonpino(性能最好)bunyannpm install winston winston-daily-rotate-file
const winston = require('winston');
const { DailyRotateFile } = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
dirname: '/var/log/node-app',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d'
})
]
});
✅ 自动按大小 / 时间切分
✅ 自动删除旧日志
生产环境:
logger.level = 'info'; // 不要 debug
❌ 错误示例:
console.log(req);
✅ 正确:
logger.info({
url: req.url,
method: req.method
});
process.on('uncaughtException', e => {
logger.error('uncaught', e);
process.exit(1);
});
process.on('unhandledRejection', e => {
logger.error('unhandledRejection', e);
});
如果你用 systemd 启动 Node:
[Service]
StandardOutput=journal
StandardError=journal
然后用:
journalctl -u node-app --disk-usage
journalctl --vacuum-size=100M
find / -name "*.log" -size +100M
0 3 * * * find /var/log/node-app -name "*.log" -mtime +7 -delete
✅ Node 用 pino / winston
✅ 文件用 daily-rotate
✅ Linux 用 logrotate
✅ 生产环境 info 级别
✅ 监控磁盘 & 日志大小
如果你愿意,可以告诉我:
我可以给你一套完全适配你项目的配置。