package config import ( "bytes" "fmt" "io" "os" "path" "time" rotatelogs "github.com/lestrrat-go/file-rotatelogs" "github.com/logrusorgru/aurora" "github.com/rifflock/lfshook" "github.com/sirupsen/logrus" ) const ( maxAgeHour = 168 rotationHour = 24 ) var isInit bool var Logger *logrus.Logger func init() { isInit = false } func checkInitLog() bool { return isInit } func InitConfig(logEnv string, logPath string) { if checkInitLog() { return } Logger = initLogger(logEnv, logPath) } func initLogger(env string, logPath string) *logrus.Logger { logFilePath := "" errFilePath := "" if dir, err := os.Getwd(); err == nil { logFilePath = dir + "/logs/" + logPath + "/all.log" errFilePath = dir + "/logs/" + logPath + "/error.log" } accessWriter, err := rotatelogs.New( logFilePath+".%Y-%m-%d", rotatelogs.WithLinkName(logFilePath), rotatelogs.WithRotationTime(time.Hour*rotationHour), rotatelogs.WithMaxAge(time.Hour*maxAgeHour), ) if err != nil { panic(err) } errorWriter, err := rotatelogs.New( errFilePath+".%Y-%m-%d", rotatelogs.WithLinkName(errFilePath), rotatelogs.WithRotationTime(time.Hour*rotationHour), rotatelogs.WithMaxAge(time.Hour*maxAgeHour), ) if err != nil { panic(err) } allWriter := io.MultiWriter(accessWriter, errorWriter) //实例化 logger := logrus.New() logger.Out = os.Stdout //设置日志格式 logger.SetFormatter(&ConsoleFormatter{}) logger.SetReportCaller(true) //设置输出 if env != "dev" { logger.AddHook(lfshook.NewHook( lfshook.WriterMap{ logrus.DebugLevel: accessWriter, logrus.InfoLevel: accessWriter, logrus.ErrorLevel: allWriter, logrus.PanicLevel: allWriter, }, &SaveFormatter{}, )) } //设置日志级别 logger.SetLevel(logrus.DebugLevel) Logger = logger isInit = true return logger } type ConsoleFormatter struct { } func (m *ConsoleFormatter) Format(entry *logrus.Entry) ([]byte, error) { var b *bytes.Buffer if entry.Buffer != nil { b = entry.Buffer } else { b = &bytes.Buffer{} } timestamp := entry.Time.Format("2006-01-02 15:04:05") var newLog string var levelString aurora.Value switch entry.Level.String() { case "info": levelString = aurora.Green(entry.Level) case "warning": levelString = aurora.Yellow(entry.Level) case "debug": levelString = aurora.Gray(16-1, entry.Level) case "error": levelString = aurora.Red(entry.Level) case "fatal": levelString = aurora.Red(entry.Level) case "panic": levelString = aurora.Red(entry.Level) } newLog = fmt.Sprintf("[%s] [%s:%d] [%s] %s \n", timestamp, path.Base(entry.Caller.File), entry.Caller.Line, levelString, entry.Message) b.WriteString(newLog) return b.Bytes(), nil } type SaveFormatter struct { } func (m *SaveFormatter) Format(entry *logrus.Entry) ([]byte, error) { var b *bytes.Buffer if entry.Buffer != nil { b = entry.Buffer } else { b = &bytes.Buffer{} } timestamp := entry.Time.Format("2006-01-02 15:04:05") newLog := fmt.Sprintf("[%s] [%s:%d] [%s] %s \n", timestamp, path.Base(entry.Caller.File), entry.Caller.Line, entry.Level, entry.Message) b.WriteString(newLog) return b.Bytes(), nil }