go 日志的分装和使用 Zap + lumberjack
自带的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":"示例错误"}