注:本文为学习时记录的笔记,内容尚浅,后续有时间可能会完善
zap框架学习记录
在 Go 中实现超快、结构化、分级的日志记录。
使用zap时我们通常配合**lumberjack**库来实现日志滚动(确保日志文件保持适度大小)
1.安装与配置
安装zap
go get -u go.uber.org/zap
安装lumberjack
go get -u gopkg.in/natefinch/lumberjack.v2
2.基本使用
以下简单演示zap的初始化
package bootstrap
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"jassue-gin/global"
"jassue-gin/utils"
"os"
"time"
)
var (
level zapcore.Level // zap 日志等级
options []zap.Option // zap 配置项
)
func InitializeLog() *zap.Logger {
// 创建根目录
createRootDir()
// 设置日志等级
setLogLevel()
// 是否显示调用行
if global.App.Config.Log.ShowLine {
options = append(options, zap.AddCaller())
}
// 初始化 zap
return zap.New(getZapCore(), options...)
}
func createRootDir() {
if ok, _ := utils.PathExists(global.App.Config.Log.RootDir); !ok {
_ = os.Mkdir(global.App.Config.Log.RootDir, os.ModePerm)
}
}
func setLogLevel() {
switch global.App.Config.Log.Level {
case "debug":
level = zap.DebugLevel
options = append(options, zap.AddStacktrace(level))
case "info":
level = zap.InfoLevel
case "warn":
level = zap.WarnLevel
case "error":
level = zap.ErrorLevel
options = append(options, zap.AddStacktrace(level))
case "dpanic":
level = zap.DPanicLevel
case "panic":
level = zap.PanicLevel
case "fatal":
level = zap.FatalLevel
default:
level = zap.InfoLevel
}
}
// 扩展 Zap
func getZapCore() zapcore.Core {
var encoder zapcore.Encoder
// 调整编码器默认配置
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = func(time time.Time, encoder zapcore.PrimitiveArrayEncoder) {
encoder.AppendString(time.Format("[" + "2006-01-02 15:04:05.000" + "]"))
}
encoderConfig.EncodeLevel = func(l zapcore.Level, encoder zapcore.PrimitiveArrayEncoder) {
encoder.AppendString(global.App.Config.App.Env + "." + l.String())
}
// 设置编码器
if global.App.Config.Log.Format == "json" {
encoder = zapcore.NewJSONEncoder(encoderConfig)
} else {
encoder = zapcore.NewConsoleEncoder(encoderConfig)
}
return zapcore.NewCore(encoder, getLogWriter(), level)
}
// 使用 lumberjack 作为日志写入器
func getLogWriter() zapcore.WriteSyncer {
file := &lumberjack.Logger{
Filename: global.App.Config.Log.RootDir + "/" + global.App.Config.Log.Filename,
MaxSize: global.App.Config.Log.MaxSize,
MaxBackups: global.App.Config.Log.MaxBackups,
MaxAge: global.App.Config.Log.MaxAge,
Compress: global.App.Config.Log.Compress,
}
return zapcore.AddSync(file)
}