在 Linux 下对 Node.js 日志进行切割,常见做法有下面几种,按「推荐程度 + 复杂度」从低到高说明。
logrotate(强烈推荐)适合场景:Node.js 直接写文件(如 fs.writeFile / winston / pino 文件输出)
/var/log/node/app.log
sudo vim /etc/logrotate.d/node-app
内容示例:
/var/log/node/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
daily:每天切割rotate 14:保留 14 天compress:压缩旧日志copytruncate:不重启 Node.js 也能切割(常用)sudo logrotate -f /etc/logrotate.d/node-app
✅ 优点:不侵入代码、稳定
❌ 缺点:不是“按大小实时切”
适合场景:不想依赖系统工具
winston + winston-daily-rotate-filenpm install winston winston-daily-rotate-file
const winston = require('winston');
const { DailyRotateFile } = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
dirname: '/var/log/node',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
transports: [transport]
});
✅ 自动按天 + 大小切割
❌ 日志文件名会变化
pm2 日志管理(如果你用 pm2)pm2 install pm2-logrotate
配置示例:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true
✅ 零代码改动
✅ 适合 pm2 部署
pino + pino-rollnpm install pino pino-roll
const pino = require('pino')
const pinoRoll = require('pino-roll')
const logger = pino({
transport: {
targets: [{
target: 'pino-roll',
options: {
file: '/var/log/node/app.log',
frequency: 'daily',
size: '10m'
}
}]
}
})
✅ 高性能日志库
✅ 原生支持切割
fs.renamecron + mv
⚠️ 容易丢日志或文件句柄异常| 场景 | 推荐方案 |
|---|---|
| 生产环境通用 | ✅ logrotate |
| 用 pm2 | ✅ pm2-logrotate |
| 想代码控制 | winston / pino |
| 高并发 | pino |
如果你愿意,可以告诉我:
我可以给你一份可直接用的配置。