在 Debian 下压缩 Node.js 日志,常见做法有 手动压缩、定时任务(cron)以及使用日志轮转工具(logrotate)。下面按实用程度从高到低介绍。
logrotate(最常用、最规范)logrotate 是 Debian 自带的日志管理工具,非常适合 Node.js 日志。
sudo apt update
sudo apt install logrotate
假设你的 Node.js 日志目录是:
/var/log/myapp/
新建配置文件:
sudo nano /etc/logrotate.d/myapp
示例配置:
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 www-data www-data
copytruncate
}
| 参数 | 作用 |
|---|---|
daily |
每天轮转 |
rotate 7 |
保留 7 份 |
compress |
使用 gzip 压缩 |
delaycompress |
延迟一天压缩 |
missingok |
日志不存在不报错 |
notifempty |
空文件不轮转 |
copytruncate |
不重启 Node.js 也能生效 |
create |
新建日志文件权限 |
sudo logrotate -d /etc/logrotate.d/myapp
gzip /var/log/myapp/app.log
编辑 cron:
crontab -e
每天凌晨 2 点压缩 7 天前的日志:
0 2 * * * find /var/log/myapp -name "*.log" -mtime +7 -exec gzip {} \;
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({
dirname: '/var/log/myapp',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d',
zippedArchive: true
});
const logger = winston.createLogger({
transports: [transport]
});
✅ 优点:
| 工具 | 格式 |
|---|---|
| gzip | .log.gz |
| bzip2 | .log.bz2(压缩率高但慢) |
| xz | .log.xz(最省空间) |
gzip app.log
bzip2 app.log
xz app.log
✅ 生产环境:logrotate
✅ Node 应用内部:winston-daily-rotate-file
✅ 临时处理:gzip + cron
如果你愿意,可以把你的 Node.js 日志路径、日志生成方式(PM2 / Docker / systemd) 发我,我可以给你一份完全定制的配置。