Files
easygoadmin/utils/logger.go
yaoyilin 1b36bd8fbe feat: 初始化项目
初始化项目
2022-10-31 22:29:16 +08:00

119 lines
3.4 KiB
Go

// Copyright © 2022 Yaoyilin <46807924@qq.com>
package utils
import (
"fmt"
rotatelogs "github.com/lestrrat/go-file-rotatelogs"
"github.com/rifflock/lfshook"
"github.com/sirupsen/logrus"
"github.com/toolkits/file"
prefixed "github.com/x-cray/logrus-prefixed-formatter"
"os"
"path/filepath"
"strings"
"time"
)
var logger *logrus.Logger
var logLevels = map[string]logrus.Level{
"PANIC": logrus.PanicLevel,
// FatalLevel level. Logs and then calls `logger.Exit(1)`. It will exit even if the
// logging level is set to Panic.
"FATAL": logrus.FatalLevel,
// ErrorLevel level. Logs. Used for errors that should definitely be noted.
// Commonly used for hooks to send errors to an error tracking service.
"ERROR": logrus.ErrorLevel,
// WarnLevel level. Non-critical entries that deserve eyes.
"WARN": logrus.WarnLevel,
// InfoLevel level. General operational entries about what's going on inside the
// application.
"INFO": logrus.InfoLevel,
// DebugLevel level. Usually only enabled when debugging. Very verbose logging.
"DEBUG": logrus.DebugLevel,
// TraceLevel level. Designates finer-grained informational events than the Debug.
"TRACE": logrus.TraceLevel,
}
// NewLogRusLogger New LogRus l
func NewLogRusLogger(logfile, logLevel string) (*logrus.Logger, error) {
var (
err error
)
if logger != nil {
return logger, nil
}
logger, err = newLogRus(logfile, logLevel)
if err != nil {
return nil, err
}
return logger, nil
}
func newLogRus(logfile, logLevel string) (*logrus.Logger, error) {
// logger := logrus.New()
logDir := GetDir(logfile)
var (
found bool
err error
)
if found, err = CheckDirExist(logDir); err != nil {
return nil, err
}
if !found {
if err = MkdirAll(logDir); err != nil {
return nil, err
}
}
if logDir == logfile || logfile == "" {
logfile = filepath.Join(logDir, "default.log")
}
formatter := new(prefixed.TextFormatter)
formatter.DisableColors = true
formatter.DisableSorting = true
formatter.FullTimestamp = true // 显示完整时间
formatter.TimestampFormat = "2006-01-02 15:04:05.999999" // 时间格式
formatter.DisableTimestamp = false // 禁止显示时间
// formatter.ForceFormatting = true
writer, err := rotatelogs.New(
logfile+".%Y%m%d",
rotatelogs.WithLinkName(logfile), // 生成软链,指向最新日志文件
rotatelogs.WithMaxAge(30*24*time.Hour), // 文件最大保存时间
rotatelogs.WithRotationTime(24*time.Hour), // 日志切割时间间隔
rotatelogs.WithLocation(time.Local),
)
if err != nil {
return nil, err
}
logLevel = strings.ToUpper(logLevel)
level, ok := logLevels[logLevel]
if !ok {
return nil, fmt.Errorf("the log level not support. please set INFO,WARN,ERROR,DEBUG,TRACE")
}
// io.MultiWriter(os.Stdout)
lfHook := lfshook.NewHook(lfshook.WriterMap{
// logrus.DebugLevel: writer, // 为不同级别设置不同的输出目的
logrus.InfoLevel: os.Stdout,
logrus.WarnLevel: os.Stdout,
logrus.ErrorLevel: os.Stdout,
logrus.FatalLevel: os.Stdout,
logrus.PanicLevel: os.Stdout,
}, formatter)
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.SetLevel(level)
logrus.AddHook(lfHook)
logrus.SetOutput(writer)
logrus.SetReportCaller(true)
logger = logrus.New()
return logger, nil
}
func GetLogDir(s string) string {
if file.IsFile(s) || strings.HasSuffix(s, ".log") {
s = file.Dir(s)
}
return s
}