github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/logutils/stderr_log.go (about) 1 package logutils 2 3 import ( 4 "fmt" 5 "os" 6 "time" 7 8 "github.com/sirupsen/logrus" //nolint:depguard 9 10 "github.com/elek/golangci-lint/pkg/exitcodes" 11 ) 12 13 type StderrLog struct { 14 name string 15 logger *logrus.Logger 16 level LogLevel 17 } 18 19 var _ Log = NewStderrLog("") 20 21 func NewStderrLog(name string) *StderrLog { 22 sl := &StderrLog{ 23 name: name, 24 logger: logrus.New(), 25 level: LogLevelWarn, 26 } 27 28 switch os.Getenv("LOG_LEVEL") { 29 case "error", "err": 30 sl.logger.SetLevel(logrus.ErrorLevel) 31 case "warning", "warn": 32 sl.logger.SetLevel(logrus.WarnLevel) 33 case "info": 34 sl.logger.SetLevel(logrus.InfoLevel) 35 default: 36 sl.logger.SetLevel(logrus.DebugLevel) 37 } 38 39 sl.logger.Out = StdErr 40 formatter := &logrus.TextFormatter{ 41 DisableTimestamp: true, // `INFO[0007] msg` -> `INFO msg` 42 } 43 if os.Getenv("LOG_TIMESTAMP") == "1" { 44 formatter.DisableTimestamp = false 45 formatter.FullTimestamp = true 46 formatter.TimestampFormat = time.StampMilli 47 } 48 sl.logger.Formatter = formatter 49 50 return sl 51 } 52 53 func (sl StderrLog) prefix() string { 54 prefix := "" 55 if sl.name != "" { 56 prefix = fmt.Sprintf("[%s] ", sl.name) 57 } 58 59 return prefix 60 } 61 62 func (sl StderrLog) Fatalf(format string, args ...interface{}) { 63 sl.logger.Errorf("%s%s", sl.prefix(), fmt.Sprintf(format, args...)) 64 os.Exit(exitcodes.Failure) 65 } 66 67 func (sl StderrLog) Panicf(format string, args ...interface{}) { 68 v := fmt.Sprintf("%s%s", sl.prefix(), fmt.Sprintf(format, args...)) 69 panic(v) 70 } 71 72 func (sl StderrLog) Errorf(format string, args ...interface{}) { 73 if sl.level > LogLevelError { 74 return 75 } 76 77 sl.logger.Errorf("%s%s", sl.prefix(), fmt.Sprintf(format, args...)) 78 // don't call exitIfTest() because the idea is to 79 // crash on hidden errors (warnings); but Errorf MUST NOT be 80 // called on hidden errors, see log levels comments. 81 } 82 83 func (sl StderrLog) Warnf(format string, args ...interface{}) { 84 if sl.level > LogLevelWarn { 85 return 86 } 87 88 sl.logger.Warnf("%s%s", sl.prefix(), fmt.Sprintf(format, args...)) 89 } 90 91 func (sl StderrLog) Infof(format string, args ...interface{}) { 92 if sl.level > LogLevelInfo { 93 return 94 } 95 96 sl.logger.Infof("%s%s", sl.prefix(), fmt.Sprintf(format, args...)) 97 } 98 99 func (sl StderrLog) Debugf(format string, args ...interface{}) { 100 if sl.level > LogLevelDebug { 101 return 102 } 103 104 sl.logger.Debugf("%s%s", sl.prefix(), fmt.Sprintf(format, args...)) 105 } 106 107 func (sl StderrLog) Child(name string) Log { 108 prefix := "" 109 if sl.name != "" { 110 prefix = sl.name + "/" 111 } 112 113 child := sl 114 child.name = prefix + name 115 116 return &child 117 } 118 119 func (sl *StderrLog) SetLevel(level LogLevel) { 120 sl.level = level 121 }