在 Linux 上,Node.js 日志压缩通常不是 Node.js 自己做的,而是配合日志库 + Linux 工具/定时任务来完成。常见方案如下:
使用日志库自动切分日志,再用 Linux 压缩。
winston + winston-daily-rotate-fileconst 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',
zippedArchive: true // ✅ 自动压缩
});
const logger = winston.createLogger({
transports: [transport]
});
✅ 优点:
pino + pino-rollconst pino = require('pino');
const rotate = require('pino-roll');
const logger = pino(
{},
rotate({ file: 'logs/app.log', size: '20m', compress: 'gzip' })
);
✅ 性能好,适合高并发服务
gzip app.log
# 或
tar -czf logs.tar.gz logs/
每天凌晨压缩前一天日志:
0 0 * * * gzip /var/log/node/app-$(date -d yesterday +%F).log
logrotate(最推荐 ⭐)Linux 自带日志管理工具,适合生产环境。
/etc/logrotate.d/node-app/var/log/node/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
copytruncate
}
参数说明:
compress:gzip 压缩copytruncate:不重启 Node 也能截断日志daily:每天执行测试:
logrotate -d /etc/logrotate.d/node-app
| 方案 | 是否推荐 | 说明 |
|---|---|---|
| Node.js 内压缩 | ❌ | 影响性能 |
| winston/pino | ✅ | 自动切分+压缩 |
| logrotate | ✅✅ | 生产最稳定 |
| 手动 gzip | ⚠️ | 临时用 |
如果你愿意,可以告诉我:
我可以给你一套完整配置。