将日志服务集成到项目中,它也是框架中必不可少的,平时代码调试,线上 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)