在 Ubuntu 上压缩 Node.js 日志,常见做法有 应用层压缩、系统日志轮转(logrotate)、定时任务压缩、或运行时日志管理。下面按实用程度给你一套方案。
如果你的 Node.js 日志是写到文件(如 app.log),logrotate 是最省心的方案。
sudo nano /etc/logrotate.d/nodejs
示例(自动压缩 + 按天轮转):
/var/log/nodejs/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
说明:
compress:用 gzip 压缩copytruncate:不重启 Node.js 也能截断日志(常用)rotate 14:保留 14 天sudo logrotate -d /etc/logrotate.d/nodejs # 模拟
sudo logrotate -f /etc/logrotate.d/nodejs # 强制执行
适合你自己控制日志写入代码。
npm install winston winston-daily-rotate-file zlib
示例(每天一个 .gz 文件):
const winston = require('winston');
const { DailyRotateFile } = require('winston-daily-rotate-file');
const zlib = require('zlib');
const transport = new DailyRotateFile({
filename: '/var/log/nodejs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true, // 自动 gzip
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
transports: [transport]
});
如果你用 PM2 跑 Node.js:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
PM2 会自动:
gzip /var/log/nodejs/app.log
或定时任务:
crontab -e
0 0 * * * gzip -f /var/log/nodejs/*.log
⚠️ 注意:直接 gzip 正在写入的日志可能导致丢日志
如果是 Docker:
json-file + max-size{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "5"
}
}
| 场景 | 推荐方案 |
|---|---|
| 普通 Ubuntu 服务 | logrotate |
| PM2 | pm2-logrotate |
| 自建日志系统 | winston + gzip |
| Docker | 日志驱动 + logrotate |
如果你愿意,可以告诉我:
我可以帮你写完整可直接用的配置。