github.com/ferretdb/golangci-lint@v1.10.1/pkg/logutils/stderr_log.go (about) 1 package logutils 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/golangci/golangci-lint/pkg/exitcodes" 8 "github.com/sirupsen/logrus" //nolint:depguard 9 ) 10 11 var isTestRun = os.Getenv("GL_TEST_RUN") == "1" 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 // control log level in logutils, not in logrus 29 sl.logger.SetLevel(logrus.DebugLevel) 30 sl.logger.Out = StdErr 31 sl.logger.Formatter = &logrus.TextFormatter{ 32 DisableTimestamp: true, // `INFO[0007] msg` -> `INFO msg` 33 } 34 return sl 35 } 36 37 func exitIfTest() { 38 if isTestRun { 39 os.Exit(exitcodes.WarningInTest) 40 } 41 } 42 43 func (sl StderrLog) prefix() string { 44 prefix := "" 45 if sl.name != "" { 46 prefix = fmt.Sprintf("[%s] ", sl.name) 47 } 48 49 return prefix 50 } 51 52 func (sl StderrLog) Fatalf(format string, args ...interface{}) { 53 sl.logger.Errorf("%s%s", sl.prefix(), fmt.Sprintf(format, args...)) 54 os.Exit(exitcodes.Failure) 55 } 56 57 func (sl StderrLog) Errorf(format string, args ...interface{}) { 58 if sl.level > LogLevelError { 59 return 60 } 61 62 sl.logger.Errorf("%s%s", sl.prefix(), fmt.Sprintf(format, args...)) 63 // don't call exitIfTest() because the idea is to 64 // crash on hidden errors (warnings); but Errorf MUST NOT be 65 // called on hidden errors, see log levels comments. 66 } 67 68 func (sl StderrLog) Warnf(format string, args ...interface{}) { 69 if sl.level > LogLevelWarn { 70 return 71 } 72 73 sl.logger.Warnf("%s%s", sl.prefix(), fmt.Sprintf(format, args...)) 74 exitIfTest() 75 } 76 77 func (sl StderrLog) Infof(format string, args ...interface{}) { 78 if sl.level > LogLevelInfo { 79 return 80 } 81 82 sl.logger.Infof("%s%s", sl.prefix(), fmt.Sprintf(format, args...)) 83 } 84 85 func (sl StderrLog) Debugf(format string, args ...interface{}) { 86 if sl.level > LogLevelDebug { 87 return 88 } 89 90 sl.logger.Debugf("%s%s", sl.prefix(), fmt.Sprintf(format, args...)) 91 } 92 93 func (sl StderrLog) Child(name string) Log { 94 prefix := "" 95 if sl.name != "" { 96 prefix = sl.name + "/" 97 } 98 99 child := sl 100 child.name = prefix + name 101 102 return &child 103 } 104 105 func (sl *StderrLog) SetLevel(level LogLevel) { 106 sl.level = level 107 }