在 Linux 下对 Node.js 日志进行分割,常见做法有下面几种,从「最推荐」到「手动方案」依次说明。
npm install winston winston-daily-rotate-file
示例:
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
transports: [transport]
});
logger.info('hello');
✅ 按天 / 大小自动分割
✅ 自动压缩、清理
✅ 不需要额外系统配置
npm install pino pino-rotate
适合高并发、性能优先场景。
如果你用 PM2 管理 Node 服务:
pm2 install pm2-logrotate
配置示例:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
✅ 零代码改动
✅ 适合已用 PM2 的项目
适合 直接输出到文件 的 Node 服务。
sudo vim /etc/logrotate.d/node-app
内容示例:
/var/www/node-app/logs/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
⚠️ 重点:
copytruncate:Node 不重开文件时也能生效logrotate -d /etc/logrotate.d/node-app
适合极小项目:
fs.watch / setInterval缺点:容易写错、难维护
| 场景 | 推荐方案 |
|---|---|
| 新项目 | winston-daily-rotate-file |
| 已用 PM2 | pm2-logrotate |
| 容器 / 云原生 | stdout + 外部采集 |
| 老系统 | logrotate |
如果你愿意,可以告诉我:
console.log 还是写文件我可以直接给你一套可复制的配置。