在 Linux 下压缩 Node.js 日志,常见做法有 手动压缩、定时任务压缩、以及 让 Node.js 自动轮转并压缩。下面按常见场景给你一套实用方案。
假设日志文件是:
/var/log/node/app.log
gzip(最常用)gzip app.log
结果:
app.log.gz
✅ 优点:简单、压缩率高
❌ 缺点:原文件会被删除
tar.gztar -czvf app-$(date +%Y%m%d).tar.gz app.log
适合多个日志文件:
tar -czvf logs-$(date +%Y%m%d).tar.gz *.log
gzip -c app.log > app.log.gz
或者:
tar -czvf app.tar.gz app.log
#!/bin/bash
LOG_DIR=/var/log/node
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
gzip $LOG_DIR/app-$YESTERDAY.log
logrotate(生产环境强烈推荐 ✅)这是 最标准、最安全 的方式。
which logrotate
sudo vim /etc/logrotate.d/node-app
示例配置:
/var/log/node/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
| 参数 | 作用 |
|---|---|
daily |
每天轮转 |
rotate 7 |
保留 7 个备份 |
compress |
使用 gzip 压缩 |
delaycompress |
下次再压缩 |
copytruncate |
不重启 Node.js |
notifempty |
空文件不处理 |
✅ Node.js 不需要重启
sudo logrotate -d /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({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d',
zippedArchive: true // ✅ 自动压缩
});
const logger = winston.createLogger({
transports: [transport]
});
✅ 自动生成:
app-2026-01-21.log.gz
| 场景 | 路径 |
|---|---|
| PM2 | ~/.pm2/logs/ |
| Docker | /var/log/ 或 volume |
| 自定义 | /var/log/node/ |
| 场景 | 推荐 |
|---|---|
| 临时压缩 | gzip |
| 定时清理 | cron + gzip |
| 生产环境 | ✅ logrotate |
| Node.js 内部 | ✅ winston-daily-rotate-file |
如果你愿意,可以告诉我:
我可以帮你直接写 完整可用的配置。