package config import ( "fmt" "github.com/sirupsen/logrus" "os" "path/filepath" "strings" ) func LogSetup(mode, lvl string) { l, err := logrus.ParseLevel(lvl) if err != nil { l = logrus.InfoLevel } logrus.SetLevel(l) switch mode { case "release": case "dev": { logrus.SetReportCaller(true) logrus.SetFormatter(&CustomFormatter{}) logrus.SetOutput(os.Stdout) } } } type CustomFormatter struct{} func (f *CustomFormatter) Format(entry *logrus.Entry) ([]byte, error) { timestamp := entry.Time.Format("2006-01-02 15:04:05") level := strings.ToUpper(entry.Level.String()) msg := entry.Message file := "" line := 0 if entry.Caller != nil { file = filepath.Base(entry.Caller.File) line = entry.Caller.Line } colorCode := f.getLevelColor(entry.Level) resetCode := "\033[0m" coloredLevel := fmt.Sprintf("%s[%s]%s", colorCode, level, resetCode) errVal := entry.Data["error"] if errVal == nil { errVal = "\n" } else { errVal = fmt.Sprintf("---%v\n\n", errVal) } cyanCode := f.getLevelColor(logrus.TraceLevel) filename := fmt.Sprintf("%s[%s:%d]%s", cyanCode, file, line, resetCode) logLine := fmt.Sprintf("%s[%s]%v %s\n%v", coloredLevel, timestamp, filename, msg, errVal) return []byte(logLine), nil } func (f *CustomFormatter) getLevelColor(level logrus.Level) string { switch level { case logrus.PanicLevel: return "\033[35m" // Magenta case logrus.FatalLevel: return "\033[35m" // Magenta case logrus.ErrorLevel: return "\033[31m" // Red case logrus.WarnLevel: return "\033[33m" // Yellow case logrus.InfoLevel: return "\033[32m" // Green case logrus.DebugLevel: return "\033[34m" // Blue case logrus.TraceLevel: return "\033[36m" // Cyan default: return "\033[0m" // No color } }