在 Linux 下对 Node.js 日志进行切割,常见做法有下面几类,按推荐程度给你总结:
最常用、零运维
npm install winston winston-daily-rotate-file
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '14d', // 保留 14 天
maxSize: '20m' // 单文件最大 20MB
})
]
});
✅ 按天 / 大小自动切割
✅ 不需要额外进程
✅ 适合大多数 Node 服务
性能最好(高并发首选)
npm install pino pino-roll
const pino = require('pino');
const { roll } = require('pino-roll');
const logger = pino(
{},
roll({
file: 'logs/app.log',
frequency: 'daily',
size: '10M',
mkdir: true
})
);
✅ 极快
✅ 原生支持切割
不修改 Node 代码,只管输出到文件
const fs = require('fs');
const log = fs.createWriteStream('/var/log/node/app.log', { flags: 'a' });
/etc/logrotate.d/node-app
/var/log/node/app.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
✅ 系统级方案
✅ 支持压缩、清理
⚠️ 必须用 copytruncate(Node 不重开文件)
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
✅ 简单
✅ 适合 PM2 部署
mv> log 重定向(会丢日志)| 场景 | 推荐 |
|---|---|
| 普通 Node 服务 | winston-daily-rotate-file |
| 高并发 | pino + pino-roll |
| 生产服务器 | logrotate |
| PM2 部署 | pm2-logrotate |
如果你愿意,我可以:
你现在是哪种部署方式?