日志模块封装

1 阅读1分钟

将日志服务集成到项目中,它也是框架中必不可少的,平时代码调试,线上 Bug 分析都离不开它。这里将使用 zap 作为日志库,一般来说,日志都是需要写入到文件保存的,这也是 zap 唯一缺少的部分,所以我将结合 lumberjack 来使用,实现日志切割归档的功能。

安装 zap 日志库

go get go.uber.org/zap
go get github.com/natefinch/lumberjack

创建日志模块

config/logger.go 中初始化日志模块

package config

import (
	"os"

	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

var Log *zap.SugaredLogger
var level zapcore.Level

func InitLogger() {
	// 设置日志输出格式为 JSON
	encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())

	// 设置输出位置(文件写入器)
	writer := getLogWriter()

	// 设置日志等级
	setLogLevel()

	// 创建 core
	core := zapcore.NewCore(encoder, writer, level)

	// 创建 logger
	logger := zap.New(core, zap.AddCaller())
	Log = logger.Sugar()
}

func getLogWriter() zapcore.WriteSyncer {
	// 自动创建 logs 目录(如果不存在)
	if _, err := os.Stat("logs"); os.IsNotExist(err) {
		_ = os.Mkdir("logs", 0755)
	}

	lumberJackLogger := &lumberjack.Logger{
		Filename:   Conf.Logger.File,
		MaxSize:    10,
		MaxBackups: 5,
		MaxAge:     30,
		Compress:   true,
	}
	return zapcore.AddSync(lumberJackLogger)
}

func setLogLevel() {
	switch Conf.Logger.Level {
	case "debug":
		level = zap.DebugLevel
	case "info":
		level = zap.InfoLevel
	case "warn":
		level = zap.WarnLevel
	case "error":
		level = zap.ErrorLevel
	case "dpanic":
		level = zap.DPanicLevel
	case "panic":
		level = zap.PanicLevel
	case "fatal":
		level = zap.FatalLevel
	default:
		level = zap.InfoLevel
	}
}

在 main.go 中初始化日志

在 main.go 中调用日志初始化函数,并尝试写入日志

// main.go
import (
	"leo-gin/config"
)

func main() {
	config.InitLogger()
	defer config.Log.Sync() // 确保缓冲区日志都被写出
	// 测试日志输出
	config.Log.Info("用户列表:", "我的日志输出")
	// 其他初始化...
}

项目中任意位置调用日志

import "leo-gin/config"

config.Log.Info("用户列表:", users)