基于go.uber.org/zap框架实现随日期生成log文件

导读:本篇文章讲解 基于go.uber.org/zap框架实现随日期生成log文件,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

基于go.uber.org/zap框架实现随日期生成log文件

介绍

一直想找一个能生成当天的log目录,然后看了看找到github最火的go.uber.org/zap log框架感觉挺好用的然后就进行封装

/*
 * @Description:
 * @Version: 1.0
 * @Autor: solid
 * @Date: 2021-12-20 09:58:16
 * @LastEditors: solid
 * @LastEditTime: 2022-01-04 10:51:02
 */
/*
 * @Description:
 * @Version: 1.0
 * @Autor: solid
 * @Date: 2021-12-09 09:45:17
 * @LastEditors: solid
 * @LastEditTime: 2021-12-09 13:55:11
 */
package logger

import (
	"fmt"
	"os"
	"path"
	"runtime"
	"time"
	_ "unsafe"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
)

type myLog struct {
	ZapLog *zap.Logger
	debug  bool
}

var Log *myLog

func (log *myLog) Info(v ...interface{}) {
	if !log.debug {
		return
	}
	message := fmt.Sprintln(v...)
	fields := []zap.Field{}
	if ce := log.ZapLog.CheckCe(zap.InfoLevel, message); ce != nil {
		ce.Write(fields...)
	}
}
func (log *myLog) Infof(format string, v ...interface{}) {
	if !log.debug {
		return
	}
	message := fmt.Sprintf(format, v...)
	fields := []zap.Field{}
	if ce := log.ZapLog.CheckCe(zap.InfoLevel, message); ce != nil {
		ce.Write(fields...)
	}
}
func (log *myLog) Error(v ...interface{}) {
	if !log.debug {
		return
	}
	message := fmt.Sprintln(v...)
	fields := []zap.Field{}
	if ce := log.ZapLog.CheckCe(zap.WarnLevel, message); ce != nil {
		ce.Write(fields...)
	}
}
func (log *myLog) Errorf(format string, v ...interface{}) {
	if !log.debug {
		return
	}
	message := fmt.Sprintf(format, v...)
	fields := []zap.Field{}
	if ce := log.ZapLog.CheckCe(zap.WarnLevel, message); ce != nil {
		ce.Write(fields...)
	}
}

func (log *myLog) Debug(v ...interface{}) {
	if !log.debug {
		return
	}
	message := fmt.Sprintln(v...)
	fields := []zap.Field{}
	if ce := log.ZapLog.CheckCe(zap.DebugLevel, message); ce != nil {
		ce.Write(fields...)
	}
}
func (log *myLog) Debugf(format string, v ...interface{}) {
	if !log.debug {
		return
	}
	message := fmt.Sprintf(format, v...)
	fields := []zap.Field{}
	if ce := log.ZapLog.CheckCe(zap.DebugLevel, message); ce != nil {
		ce.Write(fields...)
	}
}
func (log *myLog) Fatal(v ...interface{}) {
	if !log.debug {
		return
	}
	message := fmt.Sprintln(v...)
	fields := []zap.Field{}
	if ce := log.ZapLog.CheckCe(zap.FatalLevel, message); ce != nil {
		ce.Write(fields...)
	}
	os.Exit(1)
}
func (log *myLog) Fatalf(format string, v ...interface{}) {
	if !log.debug {
		return
	}
	message := fmt.Sprintf(format, v...)
	fields := []zap.Field{}
	if ce := log.ZapLog.CheckCe(zap.FatalLevel, message); ce != nil {
		ce.Write(fields...)
	}
	os.Exit(1)
}
func (log *myLog) Panic(v ...interface{}) {
	if !log.debug {
		return
	}
	message := fmt.Sprintln(v...)
	fields := []zap.Field{}
	if ce := log.ZapLog.CheckCe(zap.PanicLevel, message); ce != nil {
		ce.Write(fields...)
	}
	panic(message)
}
func (log *myLog) Patalf(format string, v ...interface{}) {
	if !log.debug {
		return
	}
	message := fmt.Sprintf(format, v...)
	fields := []zap.Field{}
	if ce := log.ZapLog.CheckCe(zap.PanicLevel, message); ce != nil {
		ce.Write(fields...)
	}
	panic(message)
}

var levelMap = map[string]zapcore.Level{

	"debug": zapcore.DebugLevel,

	"info": zapcore.InfoLevel,

	"warn": zapcore.WarnLevel,

	"error": zapcore.ErrorLevel,

	"dpanic": zapcore.DPanicLevel,

	"panic": zapcore.PanicLevel,

	"fatal": zapcore.FatalLevel,
}

//生成日志文件
func setLoggerFile(lev_name string, encoder zapcore.Encoder) zapcore.Core {
	//日志级别
	priority := zap.LevelEnablerFunc(func(lev2 zapcore.Level) bool { //info和debug级别,debug级别是最低的
		return levelMap[lev_name] == lev2
	})
	var abPath string
	_, filename, _, ok := runtime.Caller(0)
	if ok {
		abPath = path.Dir(filename)
	}

	filename = fmt.Sprintf(`%s\log\%s-%s-%s\%s.log`, abPath, time.Now().Format("2006"), time.Now().Format("01"), time.Now().Format("02"), lev_name)
	//info文件writeSyncer
	infoFileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{
		Filename:   filename, //日志文件存放目录,如果文件夹不存在会自动创建
		MaxSize:    10,       //文件大小限制,单位MB
		MaxBackups: 100,      //最大保留日志文件数量
		MaxAge:     30,       //日志文件保留天数
		Compress:   false,    //是否压缩处理
	})
	return zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(infoFileWriteSyncer, zapcore.AddSync(os.Stdout)), priority)

}

func InitLog(debug bool) {
	var coreArr []zapcore.Core
	Log = &myLog{
		ZapLog: nil,
		debug:  debug,
	}
	//获取编码器
	encoderConfig := zap.NewProductionEncoderConfig()            //NewJSONEncoder()输出json格式,NewConsoleEncoder()输出普通文本格式
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder        //指定时间格式
	encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder //按级别显示不同颜色,不需要的话取值zapcore.CapitalLevelEncoder就可以了
	//encoderConfig.EncodeCaller = zapcore.FullCallerEncoder        //显示完整文件路径
	encoder := zapcore.NewConsoleEncoder(encoderConfig)
	for key := range levelMap {
		fileCore := setLoggerFile(key, encoder)
		coreArr = append(coreArr, fileCore)
	}
	Log.ZapLog = zap.New(zapcore.NewTee(coreArr...), zap.AddCaller())
}

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/61528.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!