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