From 5cf6309c132fdf1e110fb23f419e6971c63f533c Mon Sep 17 00:00:00 2001
From: gongshangguo <gongshangguo@admin.com>
Date: 星期五, 25 二月 2022 18:51:32 +0800
Subject: [PATCH] logger

---
 logger.go |  361 ++++++++++++++++++++++-----------------------------
 1 files changed, 155 insertions(+), 206 deletions(-)

diff --git a/logger.go b/logger.go
index e1e1c0d..685626b 100644
--- a/logger.go
+++ b/logger.go
@@ -1,222 +1,171 @@
 package logger
 
 import (
-	"fmt"
-	"log"
+	"github.com/natefinch/lumberjack"
+	"go.uber.org/zap"
+	"go.uber.org/zap/zapcore"
 	"os"
-	"os/exec"
 	"strings"
 	"time"
 )
 
+type BLog struct {
+	logger *zap.SugaredLogger
+}
+
+var (
+	blog *BLog
+	atomicLevel = zap.NewAtomicLevelAt(zapcore.DebugLevel)
+)
+
+func (l *BLog) Write(buf []byte) (n int, err error) {
+	l.logger.Debug(strings.Replace(string(buf),"\n","", -1))
+	return len(buf),nil
+}
+
+func GetLogFile() *BLog {
+	return  blog
+}
+
 const (
-	PanicLevel int = iota
-	FatalLevel
-	ErrorLevel
-	WarnLevel
+	DebugLevel = iota -1
 	InfoLevel
-	DebugLevel
+	WarnLevel
+	ErrorLevel
+	DPanicLevel
+	PanicLevel
+	FatalLevel
 )
 
-const (
-	color_red = uint8(iota + 91)
-	color_green		//	缁�
-	color_yellow		//	榛�
-	color_blue			// 	钃�
-	color_magenta 		//	娲嬬孩
-)
-
-const (
-	fatalPrefix		=	"[FATAL] "
-	errorPrefix		=	"[ERROR] "
-	warnPrefix		=	"[WARN] "
-	infoPrefix		=	"[INFO] "
-	debugPrefix		=	"[DEBUG] "
-)
-
-const (
-	ByDay	int = iota
-	ByWeek
-	ByMonth
-	BySize
-)
-
-type LogFile struct {
-	level    int		// 鏃ュ織绛夌骇
-	saveMode int		// 淇濆瓨妯″紡
-	saveDays int		// 鏃ュ織淇濆瓨澶╂暟
-	logTime  int64		//
-	fileName string		// 鏃ュ織鏂囦欢鍚�
-	filesize int64		// 鏂囦欢澶у皬, 闇�瑕佽缃� saveMode 涓� BySize 鐢熸晥
-	fileFd   *os.File
-}
-
-var logFile LogFile
-
-func init()  {
-	//logFile.logTime = time.Now().Unix()
-	logFile.saveMode = ByDay	// 榛樿鎸夊ぉ淇濆瓨
-	logFile.saveDays = 15		// 榛樿淇濆瓨涓夊ぉ鐨�
-	logFile.level = ErrorLevel
-	logFile.filesize = 1024 * 1024 * 10	// 榛樿10M锛� 闇�瑕佽缃� saveMode 涓� BySize
-}
-
-func Config(logFolder string, level int) {
-	logFile.fileName = logFolder
-	logFile.level = level
-
-	log.SetOutput(logFile)
-	//log.SetFlags(log.Lmicroseconds | log.Lshortfile)
-	log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
-}
-func GetLogFile() (*LogFile) {
-	return &logFile
-}
-
-func SetLevel(level int) {
-	logFile.level = level
-}
-
-func SetSaveMode(saveMode int)  {
-	logFile.saveMode = saveMode
-}
-
-func SetSaveDays(saveDays int)  {
-	logFile.saveDays = saveDays
-}
-
-func SetSaveSize(saveSize int64)  {
-	logFile.filesize = saveSize
-}
-
-func Debug(args ...interface{}) {
-	if logFile.level >= DebugLevel {
-		log.SetPrefix(blue(debugPrefix))
-		_ = log.Output(2, fmt.Sprintln(args...))
-	}
-}
-
-func Info(args ...interface{}) {
-	if logFile.level >= InfoLevel {
-		log.SetPrefix(green(infoPrefix))
-		_ = log.Output(2, fmt.Sprintln(args...))
-	}
-}
-
-func Warn(args ...interface{}) {
-	if logFile.level >= WarnLevel {
-		log.SetPrefix(magenta(warnPrefix))
-		_ = log.Output(2, fmt.Sprintln(args...))
-	}
-}
-
-func Error(args ...interface{}) {
-	if logFile.level >= ErrorLevel {
-		log.SetPrefix(red(errorPrefix))
-		_ = log.Output(2, fmt.Sprintln(args...))
-	}
-}
-
-func Fatal(args ...interface{}) {
-	if logFile.level >= FatalLevel {
-		log.SetPrefix(red(fatalPrefix))
-		_ = log.Output(2, fmt.Sprintln(args...))
-	}
-}
-
-func GetRedPrefix(s string) string {
-	return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_red, s)
-}
-
-func red(s string) string {
-	return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_red, s)
-}
-
-func green(s string) string {
-	return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_green, s)
-}
-
-func yellow(s string) string {
-	return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_yellow, s)
-}
-
-func blue(s string) string {
-	return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_blue, s)
-}
-
-func magenta(s string) string {
-	return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_magenta, s)
-}
-
-func (me LogFile) Write(buf []byte) (n int, err error) {
-	if me.fileName == "" {
-		fmt.Printf("consol: %s", buf)
-		return len(buf), nil
-	}
-
-	switch logFile.saveMode {
-	case BySize:
-		fileInfo, err := os.Stat(logFile.fileName)
-		if  err != nil {
-			logFile.createLogFile()
-			logFile.logTime = time.Now().Unix()
-		}else {
-			filesize:= fileInfo.Size();
-			if logFile.fileFd == nil ||
-				filesize > logFile.filesize {
-				logFile.createLogFile()
-				logFile.logTime = time.Now().Unix()
-			}
-		}
-	default:	// 榛樿鎸夊ぉ  ByDay
-		if logFile.logTime+3600*24 < time.Now().Unix() {
-			logFile.createLogFile()
-			logFile.logTime = time.Now().Unix()
-		}
-	}
-
-	if logFile.fileFd == nil {
-		fmt.Printf("log fileFd is nil !\n")
-		return len(buf), nil
-	}
-
-	return logFile.fileFd.Write(buf)
-}
-
-func (me *LogFile) createLogFile() {
+func InitLogger(logPath string, logLevel int,maxSize int, maxBackups int, maxAge int) *zap.SugaredLogger {
 	logdir := "./logger/"
-	if index := strings.LastIndex(me.fileName, "/"); index != -1 {
-		logdir = me.fileName[0:index] + "/"
-		os.MkdirAll(me.fileName[0:index], os.ModePerm)
-	}
-
-	now := time.Now()
-	filename := fmt.Sprintf("%s_%04d%02d%02d%02d",
-		me.fileName, now.Year(), now.Month(), now.Day(), now.Hour())
-	if err := os.Rename(me.fileName, filename); err == nil {
-		go func() {
-			filenameTemp := filename + "Temp"
-			tarCmd := exec.Command("tar", "-zcf", filename + ".tar.gz", filenameTemp, "--remove-files")
-			tarCmd.Run()
-
-			rmSrcCmd := exec.Command("rm",  filename)
-			rmSrcCmd.Run()
-
-			rmCmd := exec.Command("/bin/sh", "-c",
-				"find "+logdir+` -type f -mtime +` +string(logFile.saveDays)+ ` -exec rm {} \;`)
-			rmCmd.Run()
-		}()
-	}
-
-	for index := 0; index < 10; index++ {
-		if fd, err := os.OpenFile(me.fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666); nil == err {
-			me.fileFd.Sync()
-			me.fileFd.Close()
-			me.fileFd = fd
-			break
-		}else {
-			fmt.Println("Open logfile error! err: ", err.Error())
+	logName := ""
+	if index := strings.LastIndex(logPath, "/"); index != -1 {
+		logdir = logPath[0:index] + "/"
+		if index < len(logPath)-1 {
+			logName = logPath[index+1:]
 		}
-		me.fileFd = nil
+	} else {
+		logName = logPath
 	}
+	if logName == "" {
+		logName = "log.log"
+	}
+	fi,err := os.Stat(logdir)
+	if !((err == nil || os.IsExist(err)) && fi.IsDir()) {
+		os.MkdirAll(logdir, os.ModePerm)
+	}
+	if logLevel < DebugLevel || logLevel > FatalLevel {
+		logLevel = DebugLevel
+	}
+	if maxSize <=0 {
+		maxSize = 128
+	}
+	if maxBackups <=0 {
+		maxBackups = 30
+	}
+	if maxAge <= 0 {
+		maxAge = 15
+	}
+	hook := lumberjack.Logger {
+		Filename: logdir+logName,   //鏃ュ織鏂囦欢鐨勪綅缃�
+		MaxSize: maxSize,   	 //鍦ㄨ繘琛屽垏鍓蹭箣鍓嶏紝鏃ュ織鏂囦欢鐨勬渶澶уぇ灏忥紙浠B涓哄崟浣嶏級
+		MaxBackups: maxBackups, 	 //淇濈暀鏃ф枃浠剁殑鏈�澶т釜鏁�
+		MaxAge: maxAge, 			 //淇濈暀鏃ф枃浠剁殑鏈�澶уぉ鏁�
+		Compress: true,   	 //鏄惁鍘嬬缉
+		LocalTime: true,
+	}
+	w := zapcore.AddSync(&hook)
+
+	atomicLevel = zap.NewAtomicLevelAt(getZapLevel(logLevel))
+
+	encoderConfig := zap.NewProductionEncoderConfig()
+	encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
+	encoderConfig.CallerKey = "file"
+	encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder
+	encoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
+		enc.AppendString(t.Format("2006-01-02 15:04:05"))
+	}
+
+	core := zapcore.NewCore(
+		zapcore.NewConsoleEncoder(encoderConfig),
+		w,
+		atomicLevel,
+	)
+
+	log := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
+
+	blog = &BLog{
+		logger: log.Sugar(),
+	}
+	blog.logger.Info("init logger success")
+	return blog.logger
+}
+
+func getZapLevel(logLevel int) zapcore.Level {
+	var level zapcore.Level
+	switch logLevel {
+	case DebugLevel:
+		level = zap.DebugLevel
+	case InfoLevel:
+		level = zap.InfoLevel
+	case WarnLevel:
+		level = zap.WarnLevel
+	case ErrorLevel:
+		level = zap.ErrorLevel
+	case DPanicLevel:
+		level = zap.DPanicLevel
+	case PanicLevel:
+		level = zap.PanicLevel
+	case FatalLevel:
+		level = zap.FatalLevel
+	default:
+		level = zap.InfoLevel
+	}
+	return level
+}
+
+func SetLevel(lv int) error {
+	atomicLevel.SetLevel(getZapLevel(lv))
+	return nil
+}
+
+func Debug(v ...interface{}) {
+	blog.logger.Debug(v...)
+}
+
+func Debugf(template string, v ...interface{}) {
+	blog.logger.Debugf(template, v...)
+}
+
+func Info(v ...interface{}) {
+	blog.logger.Info(v)
+}
+
+func Infof(template string, v ...interface{}) {
+	blog.logger.Infof(template, v...)
+}
+
+func Warn(v ...interface{}) {
+	blog.logger.Warn(v...)
+}
+
+func Warnf(template string, v ...interface{}) {
+	blog.logger.Warnf(template, v...)
+}
+
+func Error(v ...interface{}) {
+	blog.logger.Error(v...)
+}
+
+func Errorf(template string, v ...interface{}) {
+	blog.logger.Errorf(template, v...)
+}
+
+func Fatal(v ...interface{}) {
+	blog.logger.Fatal(v...)
+}
+
+func Fatalf(template string, v ...interface{}) {
+	blog.logger.Fatalf(template, v...)
 }

--
Gitblit v1.8.0