|
| 1 | +package log |
| 2 | + |
| 3 | +import ( |
| 4 | + "os" |
| 5 | + "sync" |
| 6 | + |
| 7 | + "github.com/sirupsen/logrus" |
| 8 | +) |
| 9 | + |
| 10 | +var ( |
| 11 | + logger *logrus.Logger |
| 12 | + loggerOnce sync.Once |
| 13 | + levelPrintNames = map[logrus.Level]string{ |
| 14 | + logrus.PanicLevel: "Panic", |
| 15 | + logrus.FatalLevel: "Fatal", |
| 16 | + logrus.ErrorLevel: "Error", |
| 17 | + logrus.WarnLevel: "Warn", |
| 18 | + logrus.InfoLevel: "Info", |
| 19 | + logrus.DebugLevel: "Debug", |
| 20 | + logrus.TraceLevel: "Trace", |
| 21 | + } |
| 22 | + levelFlagNames = map[string]logrus.Level{ |
| 23 | + "panic": logrus.PanicLevel, |
| 24 | + "fatal": logrus.FatalLevel, |
| 25 | + "error": logrus.ErrorLevel, |
| 26 | + "warn": logrus.WarnLevel, |
| 27 | + "info": logrus.InfoLevel, |
| 28 | + "debug": logrus.DebugLevel, |
| 29 | + "trace": logrus.TraceLevel, |
| 30 | + } |
| 31 | +) |
| 32 | + |
| 33 | +// customFormatter implements logrus.Formatter to print errors in the format: Error: message |
| 34 | +// and other levels as usual. |
| 35 | +type customFormatter struct{} |
| 36 | + |
| 37 | +func (f *customFormatter) Format(entry *logrus.Entry) ([]byte, error) { |
| 38 | + level, ok := levelPrintNames[entry.Level] |
| 39 | + if !ok { |
| 40 | + level = entry.Level.String() |
| 41 | + } |
| 42 | + return []byte(level + ": " + entry.Message + "\n"), nil |
| 43 | +} |
| 44 | + |
| 45 | +// GetLogger returns a singleton logrus.Logger instance |
| 46 | +func GetLogger() *logrus.Logger { |
| 47 | + loggerOnce.Do(func() { |
| 48 | + logger = logrus.New() |
| 49 | + logger.SetLevel(logrus.InfoLevel) |
| 50 | + logger.SetFormatter(&customFormatter{}) |
| 51 | + }) |
| 52 | + return logger |
| 53 | +} |
| 54 | + |
| 55 | +// SetLevel sets the log level for the logger |
| 56 | +func SetLevel(level logrus.Level) { |
| 57 | + GetLogger().SetLevel(level) |
| 58 | +} |
| 59 | + |
| 60 | +// InitLogger sets the log level based on the verbosity string and exits on error |
| 61 | +func InitLogger(verbosity string) { |
| 62 | + level, ok := levelFlagNames[verbosity] |
| 63 | + if !ok { |
| 64 | + GetLogger().Error("Unknown verbosity level: " + verbosity) |
| 65 | + os.Exit(1) |
| 66 | + } |
| 67 | + SetLevel(level) |
| 68 | +} |
0 commit comments