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":"示例错误"}
相关推荐
浪扼飞舟2 小时前
c#基础(一)
开发语言·c#
en-route2 小时前
如何在 Spring Boot 中指定不同的配置文件?
java·spring boot·后端
百锦再2 小时前
在 CentOS 系统上实现定时执行 Python 邮件发送任务
java·linux·开发语言·人工智能·python·centos·pygame
栀椩2 小时前
springboot配置请求日志
java·spring boot·后端
何似在人间5753 小时前
Go语言快速入门教程(JAVA转go)——1 概述
java·开发语言·golang
边疆.3 小时前
【C++】继承详解
开发语言·c++·继承
Swift社区3 小时前
如何解决 Spring Bean 循环依赖
java·后端·spring
爱吃烤鸡翅的酸菜鱼3 小时前
【Redis】常用数据结构之Hash篇:从常用命令到使用场景详解
数据结构·数据库·redis·后端·缓存·哈希算法
lxh01134 小时前
LRU 缓存
开发语言·前端·javascript