package main import ( "fmt" "io" "os" "time" "github.com/fatih/color" ) var ( DefaultLogger = &Logger{ output: []io.Writer{os.Stdout}, } log = DefaultLogger ) type Logger struct { output []io.Writer } func (l *Logger) AddOutput(out io.Writer) { l.output = append(l.output, out) } func (l *Logger) ResetOutput() { l.output = nil } // cat stands for category (Example categories: "INFO", "WARN", "FATAL") func (l *Logger) Log(cat string, style *color.Color, a ...any) { now := time.Now() day, month, year := now.Day(), now.Month(), now.Year() hour, min, sec := now.Hour(), now.Minute(), now.Second() dayStr := fmt.Sprint(int(day)) monthStr := fmt.Sprint(int(month)) hourStr := fmt.Sprint(int(hour)) minStr := fmt.Sprint(int(min)) secStr := fmt.Sprint(int(sec)) if len(dayStr) < 2 { dayStr = "0" + dayStr } if len(monthStr) < 2 { monthStr = "0" + monthStr } if len(hourStr) < 2 { hourStr = "0" + hourStr } if len(minStr) < 2 { minStr = "0" + minStr } if len(secStr) < 2 { secStr = "0" + secStr } s := fmt.Sprint(a...) data := fmt.Sprintf("[%s/%s/%d - %s:%s:%s] %s - %s\n", monthStr, dayStr, year, hourStr, minStr, secStr, style.Sprint(cat), s) for _, out := range l.output { out.Write([]byte(data)) } } func (l *Logger) Info(a ...any) { style := color.New(color.FgWhite, color.Bold) l.Log("INFO", style, a...) } func (l *Logger) Warn(a ...any) { style := color.New(color.FgYellow, color.Bold) l.Log("WARN", style, a...) } func (l *Logger) Fatal(a ...any) { style := color.New(color.FgRed, color.Bold) l.Log("FATAL", style, a...) }