github.com/awesome-flow/flow@v0.0.3-0.20190918184116-508d75d68a2c/pkg/corev1alpha1/logger.go (about)

     1  package corev1alpha1
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"os"
     7  	"time"
     8  )
     9  
    10  type LogSev uint8
    11  
    12  const (
    13  	LogSevDebug LogSev = iota
    14  	LogSevTrace
    15  	LogSevInfo
    16  	LogSevWarn
    17  	LogSevError
    18  	LogSevFatal
    19  )
    20  
    21  type Log struct {
    22  	sev     LogSev
    23  	payload string
    24  }
    25  
    26  func NewLog(sev LogSev, payload string) *Log {
    27  	return &Log{
    28  		sev:     sev,
    29  		payload: payload,
    30  	}
    31  }
    32  
    33  type Logger struct {
    34  	logs chan *Log
    35  	out  io.Writer
    36  	done chan struct{}
    37  }
    38  
    39  var _ Runner = (*Logger)(nil)
    40  
    41  func NewLogger(out io.Writer) *Logger {
    42  	return &Logger{
    43  		logs: make(chan *Log),
    44  		out:  out,
    45  		done: make(chan struct{}),
    46  	}
    47  }
    48  
    49  func (logger *Logger) Start() error {
    50  	go func() {
    51  		var err error
    52  		for log := range logger.logs {
    53  			_, err = fmt.Fprintln(logger.out, logger.Format(log))
    54  			if err != nil {
    55  				panic(err.Error())
    56  			}
    57  		}
    58  		close(logger.done)
    59  	}()
    60  
    61  	return nil
    62  }
    63  
    64  func (logger *Logger) Stop() error {
    65  	close(logger.logs)
    66  	<-logger.done
    67  
    68  	return nil
    69  }
    70  
    71  var LogSevLex map[LogSev]string
    72  
    73  func init() {
    74  	LogSevLex = map[LogSev]string{
    75  		LogSevDebug: "DEBUG",
    76  		LogSevTrace: "TRACE",
    77  		LogSevInfo:  "INFO",
    78  		LogSevWarn:  "WARN",
    79  		LogSevError: "ERROR",
    80  		LogSevFatal: "FATAL",
    81  	}
    82  }
    83  
    84  func (logger *Logger) Format(log *Log) string {
    85  	return fmt.Sprintf(
    86  		"%s\t%s\t%s",
    87  		time.Now().Format(time.RFC3339),
    88  		LogSevLex[log.sev],
    89  		log.payload,
    90  	)
    91  }
    92  
    93  func (logger *Logger) Debug(format string, a ...interface{}) {
    94  	logger.logs <- NewLog(LogSevDebug, fmt.Sprintf(format, a...))
    95  }
    96  
    97  func (logger *Logger) Trace(format string, a ...interface{}) {
    98  	logger.logs <- NewLog(LogSevTrace, fmt.Sprintf(format, a...))
    99  }
   100  
   101  func (logger *Logger) Info(format string, a ...interface{}) {
   102  	logger.logs <- NewLog(LogSevInfo, fmt.Sprintf(format, a...))
   103  }
   104  
   105  func (logger *Logger) Warn(format string, a ...interface{}) {
   106  	logger.logs <- NewLog(LogSevWarn, fmt.Sprintf(format, a...))
   107  }
   108  
   109  func (logger *Logger) Error(format string, a ...interface{}) {
   110  	logger.logs <- NewLog(LogSevError, fmt.Sprintf(format, a...))
   111  }
   112  
   113  func (logger *Logger) Fatal(format string, a ...interface{}) {
   114  	logger.logs <- NewLog(LogSevFatal, fmt.Sprintf(format, a...))
   115  	logger.Stop()
   116  	logger.terminate()
   117  }
   118  
   119  func (logger *Logger) terminate() {
   120  	os.Exit(1)
   121  }