在 Linux 下对 Node.js 日志进行分割(rotate),常见做法有三类:应用层日志库自带分割、系统工具 logrotate、进程管理器自带功能。下面按常见程度给你一套实用方案。
winston + winston-daily-rotate-file适合希望日志按天/大小自动切分的场景。
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',
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
transports: [transport]
});
✅ 优点
pino + pino-rotate性能更好,适合高并发服务。
npm install pino pino-rotate
logrotate(最推荐生产环境)假设你的 Node 服务输出日志到:
/var/log/node/app.log
sudo vim /etc/logrotate.d/node-app
内容示例:
/var/log/node/app.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
}
daily:每天分割rotate 14:保留 14 份compress:压缩旧日志copytruncate:不重启进程直接截断日志(Node 常用)✅ 优点
⚠️ 注意
copytruncate,需让 Node 支持 SIGHUP 重新打开日志文件如果你用 PM2:
pm2 install pm2-logrotate
配置示例:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
✅ 自动按大小分割
✅ 不需要额外配置系统
如果是容器:
console.log('info message')
| 场景 | 推荐方案 |
|---|---|
| 普通 Node 服务 | winston-daily-rotate-file |
| 生产服务器 | logrotate |
| PM2 管理 | pm2-logrotate |
| Docker | stdout + 日志驱动 |
如果你愿意,可以告诉我:
我可以给你直接可用的配置。