github.com/thrasher-corp/golangci-lint@v1.17.3/pkg/logutils/stderr_log.go (about)

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