在 Debian 上压缩 Go 应用产生的日志,常见做法有 应用内轮转压缩、系统工具(logrotate)、外部采集压缩 几种。下面按实用程度给你一套清晰方案。
Debian 自带 logrotate,非常适合压缩 Go 程序日志。
sudo apt install logrotate
假设日志路径:/var/log/myapp/*.log
sudo vim /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
daily:每天轮转rotate 14:保留 14 天compress:使用 gzip 压缩delaycompress:延迟一天压缩(防写入冲突)copytruncate:不重启 Go 程序,直接截断日志(非常适合 Go)sudo logrotate -d /etc/logrotate.d/myapp
sudo logrotate -f /etc/logrotate.d/myapp
如果你希望 日志自动压缩并控制大小,推荐用库:
gopkg.in/natefinch/lumberjack.v2import (
"gopkg.in/natefinch/lumberjack.v2"
"log"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // MB
MaxBackups: 7,
MaxAge: 14, // days
Compress: true, // gzip 压缩
})
log.Println("hello")
}
✅ 优点:
如果你用 zap:
writer := zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 50,
MaxBackups: 10,
MaxAge: 30,
Compress: true,
})
core := zapcore.NewCore(
zapcore.JSONEncoder{},
writer,
zap.InfoLevel,
)
logger := zap.New(core)
gzip /var/log/myapp/app.log.1
或定时任务:
0 0 * * * gzip /var/log/myapp/*.log.old
| 场景 | 推荐 |
|---|---|
| 简单服务 | logrotate |
| 容器 / 无 root | lumberjack |
| 高并发日志 | zap + lumberjack |
| 不想改代码 | logrotate |
如果你愿意,可以告诉我:
我可以帮你写 精准配置。