在 Node.js 里分割日志文件通常有几种常见做法,取决于你用的是 原生日志、第三方日志库,还是运行环境(Linux / Docker / PM2)。下面按推荐程度给你一个完整方案。
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({
dirname: 'logs',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m', // 单文件最大 20MB
maxFiles: '14d', // 保留 14 天
zippedArchive: true // 压缩旧日志
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
transport,
new winston.transports.Console()
]
});
logger.info('Hello log');
✅ 优点:
如果你用 PM2 管理 Node.js 进程,这是最简单的方式。
npm install pm2 -g
pm2 start app.js --name my-app
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
✅ 优点:
logrotate(服务器标准做法)✅适合 直接运行 Node.js 或 Docker 容器。
/etc/logrotate.d/node-app/var/log/node/app.log {
daily
rotate 7
size 50M
missingok
notifempty
compress
copytruncate
}
✅ 优点:
⚠️ 注意:
copytruncate 可能会导致极少量日志丢失pino + pino-roll(高性能日志)⚡如果你追求性能(如高并发服务):
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',
limit: 7
})
);
✅ 优点:
| 方案 | 原因 |
|---|---|
| 自己写 fs.appendFile | 容易丢日志、难维护 |
| 单文件无限增长 | 磁盘会被打满 |
| console.log 上生产 | 不可控、不可分割 |
| 场景 | 推荐方案 |
|---|---|
| 普通 Node.js 项目 | winston + daily-rotate-file |
| PM2 部署 | pm2-logrotate |
| 服务器运维 | logrotate |
| 高性能服务 | pino + pino-roll |
如果你愿意,可以告诉我:
我可以帮你给出最合适的配置方案。