自帶的log無法滿足 按大小輪轉 ,按天數清理舊日志 ,自動壓縮 ,限制備份數量 ,防止磁盤寫滿 ,生產環境推薦 等
使用 Zap + lumberjack
package mainimport ("go.uber.org/zap""go.uber.org/zap/zapcore""gopkg.in/natefinch/lumberjack.v2""os""path/filepath"
)var logger *zap.Logger
// 初始化日志配置
func InitLogger() {// 確保 log 目錄存在logDir := "log"if err := os.MkdirAll(logDir, 0755); err != nil {panic("無法創建日志目錄: " + err.Error())}// 日志文件路徑logFilePath := filepath.Join(logDir, "app.log")//每天一個文件logName := time.Now().Format("2006-01-02")logFilePath := filepath.Join(logDir, fmt.Sprintf("%v.log", logName))// lumberjack 配置:日志輪轉writeSyncer := zapcore.AddSync(&lumberjack.Logger{Filename: logFilePath, // 日志文件路徑MaxSize: 100, // 單文件最大 100 MBMaxBackups: 10, // 最多保留 10 個備份MaxAge: 28, // 文件最多保留 28 天Compress: true, // 是否壓縮舊日志(.gz)})// 編碼器配置(JSON 格式)encoderConfig := zap.NewProductionEncoderConfig()encoderConfig.TimeKey = "time"encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // 人類可讀時間格式encoder := zapcore.NewJSONEncoder(encoderConfig)// 日志級別:生產環境一般用 InfoLevelcore := zapcore.NewCore(encoder, writeSyncer, zap.InfoLevel)// 構建 Loggerlogger = zap.New(core, zap.AddCaller()) // 可選:添加調用位置
}// 獲取 Logger 實例
func GetLogger() *zap.Logger {return logger
}// 確保日志緩沖區落盤
func SyncLogger() {if logger != nil {logger.Sync()}
}// 示例錯誤
var ErrExample = &MyError{Msg: "示例錯誤"}// 自定義錯誤類型
type MyError struct {Msg string
}
// 實現 error 接口
func (e *MyError) Error() string {return e.Msg
}func main() {InitLogger()defer SyncLogger() // 確保緩沖區日志落盤log := GetLogger()log.Info("服務啟動成功",zap.String("version", "1.0.0"),zap.Int("port", 8080),)log.Warn("這是一個警告",zap.String("reason", "磁盤空間不足"),)log.Error("發生錯誤",zap.Error(ErrExample),)}
結果配置如下
{"level":"info","time":"2025-09-11T16:13:12.515+0800","caller":"test/main.go:71","msg":"服務啟動成功","version":"1.0.0","port":8080}
{"level":"warn","time":"2025-09-11T16:13:12.523+0800","caller":"test/main.go:76","msg":"這是一個警告","reason":"磁盤空間不足"}
{"level":"error","time":"2025-09-11T16:13:12.523+0800","caller":"test/main.go:80","msg":"發生錯誤","error":"示例錯誤"}
{"level":"info","time":"2025-09-11T16:20:18.157+0800","caller":"logger/main.go:71","msg":"服務啟動成功","version":"1.0.0","port":8080}
{"level":"warn","time":"2025-09-11T16:20:18.165+0800","caller":"logger/main.go:76","msg":"這是一個警告","reason":"磁盤空間不足"}
{"level":"error","time":"2025-09-11T16:20:18.165+0800","caller":"logger/main.go:80","msg":"發生錯誤","error":"示例錯誤"}
{"level":"info","time":"2025-09-11T16:20:27.451+0800","caller":"logger/main.go:71","msg":"服務啟動成功","version":"1.0.0","port":8080}
{"level":"warn","time":"2025-09-11T16:20:27.458+0800","caller":"logger/main.go:76","msg":"這是一個警告","reason":"磁盤空間不足"}
{"level":"error","time":"2025-09-11T16:20:27.458+0800","caller":"logger/main.go:80","msg":"發生錯誤","error":"示例錯誤"}