在 Linux 下对 Node.js 日志进行切割,常见做法有 应用内切割 和 系统级切割 两类。下面按实用程度逐一说明。
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', // 保留 14 天
zippedArchive: true // 压缩旧日志
});
const logger = winston.createLogger({
transports: [transport]
});
logger.info('hello');
✅ 优点
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.js 直接输出到 stdout 或文件(如 node app.js > app.log):
sudo vim /etc/logrotate.d/node-app
/var/www/node-app/logs/app.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
}
| 参数 | 作用 |
|---|---|
| daily | 每天切割 |
| rotate | 保留数量 |
| compress | 压缩 |
| copytruncate | 不重启 Node 直接截断 |
✅ 适合 PM2 / 原生 node
如果你用 PM2:
pm2 install pm2-logrotate
配置:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true
✅ 最简单,无需改代码
logrotate -f /etc/logrotate.d/node-app
或结合 crontab:
0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/node-app
| 场景 | 推荐 |
|---|---|
| 新项目 | winston / pino |
| 已有 stdout | logrotate |
| PM2 部署 | pm2-logrotate |
| 高并发 | pino |
如果你愿意,可以告诉我:
我可以给你一套 可直接用的配置。