github.com/0chain/gosdk@v1.17.11/core/logger/logger.go (about)

     1  // Provides a simple logger for the SDK.
     2  package logger
     3  
     4  import (
     5  	"fmt"
     6  	"io"
     7  	"log"
     8  	"os"
     9  )
    10  
    11  const (
    12  	NONE  = 0
    13  	FATAL = 1
    14  	ERROR = 2
    15  	INFO  = 3
    16  	DEBUG = 4
    17  )
    18  
    19  const cRed = "\u001b[31m"
    20  const cReset = "\u001b[0m"
    21  
    22  const (
    23  	strFATAL = cRed + "[FATAL]  "
    24  	strERROR = cRed + "[ERROR]  "
    25  	strINFO  = "[INFO]   "
    26  	strDEBUG = "[DEBUG]  "
    27  )
    28  
    29  type Logger struct {
    30  	lvl      int
    31  	prefix   string
    32  	logDebug *log.Logger
    33  	logInfo  *log.Logger
    34  	logError *log.Logger
    35  	logFatal *log.Logger
    36  	fWriter  io.Writer
    37  }
    38  
    39  // Init - Initialize logging
    40  func (l *Logger) Init(lvl int, prefix string) {
    41  	l.SetLevel(lvl)
    42  	l.prefix = prefix
    43  	l.logDebug = log.New(os.Stderr, prefix+": "+strDEBUG, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
    44  	l.logInfo = log.New(os.Stderr, prefix+": "+strINFO, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
    45  	l.logError = log.New(os.Stderr, prefix+": "+strERROR, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
    46  	l.logFatal = log.New(os.Stderr, prefix+": "+strFATAL, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
    47  }
    48  
    49  // SetLevel - Configures the log level. Higher the number more verbose.
    50  func (l *Logger) SetLevel(lvl int) {
    51  	l.lvl = lvl
    52  }
    53  
    54  // syncPrefixes - syncs the logger prefixes
    55  func syncPrefixes(maxPrefixLen int, loggers []*Logger) {
    56  	for _, lgr := range loggers {
    57  		if maxPrefixLen-len(lgr.prefix) > 0 {
    58  			lgr.prefix = fmt.Sprintf("%-*s", maxPrefixLen, lgr.prefix)
    59  		}
    60  	}
    61  }
    62  
    63  // SyncLoggers syncs the loggers prefixes
    64  //   - loggers is the list of loggers to sync
    65  func SyncLoggers(loggers []*Logger) {
    66  	maxPrefixLen := 0
    67  	for _, lgr := range loggers {
    68  		if len(lgr.prefix) > maxPrefixLen {
    69  			maxPrefixLen = len(lgr.prefix)
    70  		}
    71  	}
    72  	syncPrefixes(maxPrefixLen, loggers)
    73  }
    74  
    75  // SetLogFile - Writes log to the file. set verbose false disables log to os.Stderr
    76  func (l *Logger) SetLogFile(logFile io.Writer, verbose bool) {
    77  	dLogs := []io.Writer{logFile}
    78  	iLogs := []io.Writer{logFile}
    79  	eLogs := []io.Writer{logFile}
    80  	fLogs := []io.Writer{logFile}
    81  	if verbose {
    82  		dLogs = append(dLogs, os.Stderr)
    83  		iLogs = append(iLogs, os.Stderr)
    84  		eLogs = append(eLogs, os.Stderr)
    85  		fLogs = append(fLogs, os.Stderr)
    86  	}
    87  	l.logDebug = log.New(io.MultiWriter(dLogs...), l.prefix+" "+strDEBUG, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
    88  	l.logInfo = log.New(io.MultiWriter(iLogs...), l.prefix+" "+strINFO, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
    89  	l.logError = log.New(io.MultiWriter(eLogs...), l.prefix+" "+strERROR, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
    90  	l.logFatal = log.New(io.MultiWriter(fLogs...), l.prefix+" "+strFATAL, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lshortfile)
    91  }
    92  
    93  func (l *Logger) Debug(v ...interface{}) {
    94  	if l.lvl >= DEBUG {
    95  		l.logDebug.Output(2, fmt.Sprint(v...))
    96  	}
    97  }
    98  
    99  func (l *Logger) Info(v ...interface{}) {
   100  	if l.lvl >= INFO {
   101  		l.logInfo.Output(2, fmt.Sprint(v...))
   102  	}
   103  }
   104  
   105  func (l *Logger) Error(v ...interface{}) {
   106  	if l.lvl >= ERROR {
   107  		l.logError.Output(2, fmt.Sprint(v...)+cReset)
   108  	}
   109  }
   110  
   111  func (l *Logger) Fatal(v ...interface{}) {
   112  	if l.lvl >= FATAL {
   113  		l.logFatal.Output(2, fmt.Sprint(v...)+cReset)
   114  	}
   115  }
   116  
   117  func (l *Logger) Close() {
   118  	if c, ok := l.fWriter.(io.Closer); ok && c != nil {
   119  		c.Close()
   120  	}
   121  }