package logger import ( "fmt" "io" "log" "os" "strings" "time" "github.com/spf13/viper" ) const ( verbose = 1 << iota info error debug ) func getLogger(level int, prefix string) *log.Logger { var output io.Writer if level == error { output = os.Stderr } else { output = os.Stdout } // TODO: get from config configLevel := debug if configLevel < level { output = io.Discard } prefix = fmt.Sprintf("%-*s", 6, prefix) logger := log.New(output, prefix, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lmsgprefix) return logger } func logMessage(level string, message string) { currentLevel := viper.GetString("log_level") levels := map[string]int{ "verbose": 1, "info": 2, "error": 3, "debug": 4, } if levels[currentLevel] <= levels[level] { timestamp := time.Now().Format("2006-01-02 15:04:05") prefix := strings.ToUpper(level) fmt.Printf("%-7s %s %s\n", prefix, timestamp, message) } } func Verbose(message string) { logger := getLogger(verbose, "VERB") logger.Println(message) } func Info(message string, args ...any) { logger := getLogger(info, "INFO") msg := fmt.Sprintf(message, args...) logger.Println(msg) } func Error(message string, args ...any) { logger := getLogger(error, "ERROR") msg := fmt.Sprintf(message, args...) logger.Println(msg) } func Debug(message string, args ...any) { logger := getLogger(debug, "DEBUG") msg := fmt.Sprintf(message, args...) logger.Println(msg) } func Fatal(message string, args ...any) { logger := getLogger(error, "FATAL") msg := fmt.Sprintf(message, args...) logger.Fatalln(msg) }