在 Linux 下对 Golang 日志进行压缩,常见做法有三类:应用内压缩、日志轮转+压缩、系统级压缩。下面按实用程度给你总结。
如果你用的是标准 log 或 zap / logrus,可以包一层 gzip Writer。
package main
import (
"compress/gzip"
"log"
"os"
)
func main() {
f, _ := os.Create("app.log.gz")
gz := gzip.NewWriter(f)
logger := log.New(gz, "", log.LstdFlags)
logger.Println("hello compressed log")
gz.Close()
f.Close()
}
✅ 优点
❌ 缺点
tail 看lumberjack(Go 生态最流行)import "gopkg.in/natefinch/lumberjack.v2"
logger := &lumberjack.Logger{
Filename: "/var/log/app.log",
MaxSize: 10, // MB
MaxBackups: 5,
MaxAge: 7, // 天
Compress: true, // ✅ 自动 gzip
}
生成文件如:
app-2026-01-21.log.gz
✅ 优点
logrotate(Linux 系统级)/etc/logrotate.d/app:
/var/log/app.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
✅ 适合:
# 单文件
gzip app.log
# 批量
find /var/log/app -name "*.log" -exec gzip {} \;
zstd app.log
Go 支持:
import "github.com/klauspost/compress/zstd"
| 场景 | 推荐方案 |
|---|---|
| Go 服务 | lumberjack + Compress |
| 已上线不改代码 | logrotate |
| 极致压缩 | zstd |
| 审计日志 | gzip + 长期保留 |
如果你愿意,可以告诉我:
我可以直接给你一套 可落地的配置。