CentOS環境下Golang日志存儲策略
Golang原生log包僅提供基礎日志功能,生產環境建議使用第三方庫增強能力:
/var/log/myapp.log),確保存儲路徑存在且有寫入權限(如chmod 755 /var/log);logrus時,可通過JSONFormatter配置:logrus.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05",
})
或使用zap的JSONEncoder:encoderConfig := zapcore.EncoderConfig{
TimeKey: "timestamp",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "message",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
encoder := zapcore.NewJSONEncoder(encoderConfig)
日志輪轉可避免單個文件過大占用磁盤空間,常用方案有兩種:
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp.log", // 日志文件路徑
MaxSize: 100, // 單個文件最大100MB
MaxBackups: 7, // 保留最近7個舊文件
MaxAge: 30, // 保留最近30天
Compress: true, // 壓縮舊文件(gzip)
})
/etc/logrotate.d/myapp配置文件:/var/log/myapp.log {
daily # 每天輪轉
rotate 7 # 保留7個舊文件
compress # 壓縮舊文件
missingok # 文件不存在不報錯
notifempty # 文件為空不輪轉
create 0640 root root # 新文件權限與所有者
sharedscripts # 所有日志處理完再執行腳本
postrotate
systemctl restart myapp.service # 輪轉后重啟應用(可選)
endscript
}
根據環境設置不同日志級別,減少不必要的日志輸出:
DebugLevel,輸出詳細調試信息;InfoLevel,輸出關鍵流程信息;WarnLevel或ErrorLevel,僅輸出警告和錯誤信息(避免日志爆炸)。logrus):if env == "production" {
logrus.SetLevel(logrus.WarnLevel)
} else {
logrus.SetLevel(logrus.DebugLevel)
}
將日志發送到集中式系統,便于統一存儲、分析與報警:
logrus發送日志到Logstash):hook, err := logrustash.NewHook("tcp://localhost:5000", "myapp")
if err == nil {
logrus.AddHook(hook)
}
對日志進行實時監控,及時發現異常:
Prometheus+Grafana監控日志文件大小、數量、寫入速率等指標;Alertmanager設置報警規則(如錯誤日志超過閾值),通過郵件、短信或釘釘通知管理員;goaccess分析Nginx日志、應用日志,生成訪問統計報表。