在 Linux 下对 Node.js 日志进行分割,常见有以下几种方式,按“推荐程度”和“使用场景”给你总结:
winston + winston-daily-rotate-file最常用、零运维成本。
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
})
]
});
logger.info('hello');
✅ 优点
pino + pino-rollNode.js 高性能日志方案
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' })
);
✅ 适合高并发服务
适合 所有日志文件(包括 console.log 重定向)
/etc/logrotate.d/node-app/var/www/node-app/logs/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
说明:
daily:每天分割rotate 14:保留 14 份compress:压缩旧日志copytruncate:不重启 Node 进程⚠️ 注意
copytruncatepm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
✅ 不需要改代码
✅ 适合生产环境
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "5"
}
}
| 方案 | 是否需要改代码 | 推荐场景 |
|---|---|---|
| winston / pino | ✅ | 新项目 |
| PM2 logrotate | ❌ | PM2 部署 |
| Linux logrotate | ❌ | 服务器统一日志 |
| Docker log | ❌ | 容器环境 |
如果你愿意,可以告诉我:
我可以直接给你一份可复制的配置。