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  }