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":"示例错误"}
相关推荐
tobebetter95274 小时前
How to manage python versions on windows
开发语言·windows·python
Y***h1875 小时前
第二章 Spring中的Bean
java·后端·spring
9***P3345 小时前
PHP代码覆盖率
开发语言·php·代码覆盖率
CoderYanger5 小时前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
jllllyuz5 小时前
Matlab实现基于Matrix Pencil算法实现声源信号角度和时间估计
开发语言·算法·matlab
稚辉君.MCA_P8_Java5 小时前
DeepSeek 插入排序
linux·后端·算法·架构·排序算法
多多*5 小时前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
t***p9355 小时前
idea创建SpringBoot自动创建Lombok无效果(解决)
spring boot·后端·intellij-idea
d***81726 小时前
解决SpringBoot项目启动错误:找不到或无法加载主类
java·spring boot·后端
p***43486 小时前
Rust网络编程模型
开发语言·网络·rust