Golang 日志在 CentOS 上的压缩策略
一 策略总览与选择
二 使用 logrotate 的系统级压缩策略
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 root adm
sharedscripts
postrotate
# 可选:通知应用重新打开日志文件(如 systemd 服务)
systemctl reload myapp.service >/dev/null 2>&1 || true
endscript
}
sudo logrotate -d /etc/logrotate.d/golang-app(调试模式);sudo logrotate -f /etc/logrotate.d/golang-app;三 在 Go 程序内使用 lumberjack 实现压缩
go get gopkg.in/natefinch/lumberjack.v2package main
import (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp.log", // 日志路径
MaxSize: 10, // 单个文件最大 10 MB
MaxBackups: 7, // 最多保留 7 个历史文件
MaxAge: 28, // 最多保留 28 天
Compress: true, // 启用压缩(gzip)
})
log.Println("hello, this will be rotated and compressed")
}
四 自定义轮转与压缩脚本
// 触发轮转时
os.Rename("app.log", "app.log."+time.Now().Format("20060102-150405"))
// 重新打开 app.log 继续写入
// 压缩旧文件
exec.Command("gzip", "app.log.20060102-150405").Run()
// 清理 N 天前
exec.Command("find", "/var/log/myapp", "-name", "app.log.*.gz", "-mtime", "+30", "-delete").Run()
五 压缩策略与运维要点
systemctl reload myapp 或向进程发送 SIGHUP,确保日志句柄切换到新文件。