在 Linux 环境下压缩 Node.js 日志,通常可以从日志生成时控制、定期压缩归档、自动化管理三个层面来做。下面按常见场景给你一套实用方案。
不要自己 fs.writeFile 写日志,用成熟库:
winstonpino(性能最好,体积小)bunyan示例(pino):
const pino = require('pino')
const logger = pino({
level: 'info'
})
logger.info('server started')
✅ 好处:
pino-rolling / rotating-file一般 Linux 自带:
which logrotate
编辑:
sudo vim /etc/logrotate.d/node-app
内容:
/var/log/node-app/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
说明:
compress:用 gzip 压缩daily:每天rotate 14:保留 14 天copytruncate:不重启 Node 也能生效✅ 最稳妥方案,不用改代码
npm install winston winston-daily-rotate-file
const { createLogger, transports } = require('winston')
const DailyRotateFile = require('winston-daily-rotate-file')
const logger = createLogger({
transports: [
new DailyRotateFile({
filename: '/var/log/node-app/%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true, // 自动压缩
maxSize: '20m',
maxFiles: '14d'
})
]
})
✅ 日志自动按天 + gzip
gzip /var/log/node-app/app.log
或批量:
gzip /var/log/node-app/*.log
查看:
ls -lh /var/log/node-app/
生产环境:
level: 'info' // 不要 debug
❌ 错误示例:
logger.info({ user, req, res })
✅ 正确:
logger.info({ userId: user.id })
find /var/log/node-app -name "*.gz" -mtime +30 -delete
✅ Node.js + pino + logrotate 或 ✅ winston-daily-rotate-file(zippedArchive)
如果你愿意,可以告诉我:
我可以给你一份可直接用的配置。