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

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

使用 Zap + lumberjack

go 复制代码
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),
	)

}

结果配置如下

bash 复制代码
{"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":"示例错误"}
相关推荐
1024奇点20 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
实名上网宋凯宣20 小时前
Django
后端·python·django
Warren2Lynch20 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
Knight_AL21 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
利威尔xu21 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
FRing031 天前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
逃逸线LOF1 天前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
by209991 天前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河1 天前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
慢云智慧空间1 天前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端