package logging import ( "io" "log" "os" ) // Level type type level int const ( // DEBUG level DEBUG level = iota // INFO level INFO // WARNING level WARNING // ERROR level ERROR // FATAL level FATAL flag = log.Ldate | log.Ltime ) // Log level prefix map var prefix = map[level]string{ DEBUG: "DEBUG: ", INFO: "INFO: ", WARNING: "WARNING: ", ERROR: "ERROR: ", FATAL: "FATAL: ", } // Logger ... type Logger map[level]LoggerInterface // New returns instance of Logger func New(out, errOut io.Writer, f Formatter) Logger { // Fall back to stdout if out not set if out == nil { out = os.Stdout } // Fall back to stderr if errOut not set if errOut == nil { errOut = os.Stderr } // Fall back to DefaultFormatter if f not set if f == nil { f = new(DefaultFormatter) } l := make(map[level]LoggerInterface, 5) l[DEBUG] = &Wrapper{lvl: DEBUG, formatter: f, logger: log.New(out, f.GetPrefix(DEBUG)+prefix[DEBUG], flag)} l[INFO] = &Wrapper{lvl: INFO, formatter: f, logger: log.New(out, f.GetPrefix(INFO)+prefix[INFO], flag)} l[WARNING] = &Wrapper{lvl: INFO, formatter: f, logger: log.New(out, f.GetPrefix(WARNING)+prefix[WARNING], flag)} l[ERROR] = &Wrapper{lvl: INFO, formatter: f, logger: log.New(errOut, f.GetPrefix(ERROR)+prefix[ERROR], flag)} l[FATAL] = &Wrapper{lvl: INFO, formatter: f, logger: log.New(errOut, f.GetPrefix(FATAL)+prefix[FATAL], flag)} return Logger(l) } // Wrapper ... type Wrapper struct { lvl level formatter Formatter logger LoggerInterface } // Print ... func (w *Wrapper) Print(v ...interface{}) { v = w.formatter.Format(w.lvl, v...) v = append(v, w.formatter.GetSuffix(w.lvl)) w.logger.Print(v...) } // Printf ... func (w *Wrapper) Printf(format string, v ...interface{}) { suffix := w.formatter.GetSuffix(w.lvl) v = w.formatter.Format(w.lvl, v...) w.logger.Printf("%s"+format+suffix, v...) } // Println ... func (w *Wrapper) Println(v ...interface{}) { v = w.formatter.Format(w.lvl, v...) v = append(v, w.formatter.GetSuffix(w.lvl)) w.logger.Println(v...) } // Fatal ... func (w *Wrapper) Fatal(v ...interface{}) { v = w.formatter.Format(w.lvl, v...) v = append(v, w.formatter.GetSuffix(w.lvl)) w.logger.Fatal(v...) } // Fatalf ... func (w *Wrapper) Fatalf(format string, v ...interface{}) { suffix := w.formatter.GetSuffix(w.lvl) v = w.formatter.Format(w.lvl, v...) w.logger.Fatalf("%s"+format+suffix, v...) } // Fatalln ... func (w *Wrapper) Fatalln(v ...interface{}) { v = w.formatter.Format(w.lvl, v...) v = append(v, w.formatter.GetSuffix(w.lvl)) w.logger.Fatalln(v...) } // Panic ... func (w *Wrapper) Panic(v ...interface{}) { v = w.formatter.Format(w.lvl, v...) v = append(v, w.formatter.GetSuffix(w.lvl)) w.logger.Fatal(v...) } // Panicf ... func (w *Wrapper) Panicf(format string, v ...interface{}) { suffix := w.formatter.GetSuffix(w.lvl) v = w.formatter.Format(w.lvl, v...) w.logger.Panicf("%s"+format+suffix, v...) } // Panicln ... func (w *Wrapper) Panicln(v ...interface{}) { v = w.formatter.Format(w.lvl, v...) v = append(v, w.formatter.GetSuffix(w.lvl)) w.logger.Panicln(v...) }