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":"示例错误"}
相关推荐
Hi_kenyon14 分钟前
VUE3套用组件库快速开发(以Element Plus为例)二
开发语言·前端·javascript·vue.js
曲莫终23 分钟前
Java VarHandle全面详解:从入门到精通
java·开发语言
奋进的芋圆1 小时前
DataSyncManager 详解与 Spring Boot 迁移指南
java·spring boot·后端
ghie90901 小时前
基于MATLAB GUI的伏安法测电阻实现方案
开发语言·matlab·电阻
Gao_xu_sheng1 小时前
Inno Setup(专业安装/更新 EXE)
开发语言
计算机程序设计小李同学1 小时前
个人数据管理系统
java·vue.js·spring boot·后端·web安全
Echo娴2 小时前
Spring的开发步骤
java·后端·spring
追逐时光者2 小时前
TIOBE 公布 C# 是 2025 年度编程语言
后端·.net
吴声子夜歌2 小时前
Java数据结构与算法——基本数学问题
java·开发语言·windows