CentOS上Golang日志的备份策略
策略总览
方案一 logrotate系统级轮转
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 myapp myapp
copytruncate
}
logrotate -f /etc/logrotate.d/myapplogrotate -d /etc/logrotate.d/myapp(仅显示将要执行的操作)方案二 应用内轮转 lumberjack
go get gopkg.in/natefinch/lumberjack.v2
import (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
logger := log.New(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log", // 日志路径
MaxSize: 10, // 单个文件最大 10MB
MaxBackups: 7, // 最多保留 7 个备份
MaxAge: 30, // 最多保留 30 天
Compress: true, // 启用压缩
}, "", log.LstdFlags)
log.SetOutput(logger)
log.Println("hello, rotating logs")
方案三 集成系统日志 rsyslog
sudo systemctl start rsyslog && sudo systemctl enable rsyslogimport (
"log"
"os"
)
syslogWriter, err := os.Open("/dev/log")
if err != nil { log.Fatal(err) }
defer syslogWriter.Close()
logger := log.New(syslogWriter, "myapp: ", log.LstdFlags)
logger.Println("sent to syslog")
if $programname == 'myapp' then /var/log/myapp.log
& stop
sudo systemctl restart rsyslog,随后可用 logrotate 对 /var/log/myapp.log 再做轮转与压缩。策略选择与落地建议
logrotate -d 做语法与行为演练;对关键业务在变更窗口验证“轮转后应用是否持续写入”“压缩是否成功”“旧文件是否被清理”。