go 日志的分装和使用 Zap + lumberjack

发布于:2025-09-13 ⋅ 阅读:(15) ⋅ 点赞:(0)

自带的log无法满足 按大小轮转 ,按天数清理旧日志 ,自动压缩 ,限制备份数量 ,防止磁盘写满 ,生产环境推荐 等

使用 Zap + lumberjack

package main

import (
	"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 MB
		MaxBackups: 10,          // 最多保留 10 个备份
		MaxAge:     28,          // 文件最多保留 28 天
		Compress:   true,        // 是否压缩旧日志(.gz)
	})

	// 编码器配置(JSON 格式)
	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.TimeKey = "time"
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // 人类可读时间格式

	encoder := zapcore.NewJSONEncoder(encoderConfig)

	// 日志级别:生产环境一般用 InfoLevel
	core := zapcore.NewCore(encoder, writeSyncer, zap.InfoLevel)

	// 构建 Logger
	logger = 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":"示例错误"}


网站公告

今日签到

点亮在社区的每一天
去签到