github.com/hdt3213/godis@v1.2.9/lib/logger/logger.go (about)

     1  package logger
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"log"
     7  	"os"
     8  	"path/filepath"
     9  	"runtime"
    10  	"sync"
    11  	"time"
    12  )
    13  
    14  // Settings stores config for logger
    15  type Settings struct {
    16  	Path       string `yaml:"path"`
    17  	Name       string `yaml:"name"`
    18  	Ext        string `yaml:"ext"`
    19  	TimeFormat string `yaml:"time-format"`
    20  }
    21  
    22  var (
    23  	logFile            *os.File
    24  	defaultPrefix      = ""
    25  	defaultCallerDepth = 2
    26  	logger             *log.Logger
    27  	mu                 sync.Mutex
    28  	logPrefix          = ""
    29  	levelFlags         = []string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"}
    30  )
    31  
    32  type logLevel int
    33  
    34  // log levels
    35  const (
    36  	DEBUG logLevel = iota
    37  	INFO
    38  	WARNING
    39  	ERROR
    40  	FATAL
    41  )
    42  
    43  const flags = log.LstdFlags
    44  
    45  func init() {
    46  	logger = log.New(os.Stdout, defaultPrefix, flags)
    47  }
    48  
    49  // Setup initializes logger
    50  func Setup(settings *Settings) {
    51  	var err error
    52  	dir := settings.Path
    53  	fileName := fmt.Sprintf("%s-%s.%s",
    54  		settings.Name,
    55  		time.Now().Format(settings.TimeFormat),
    56  		settings.Ext)
    57  
    58  	logFile, err = mustOpen(fileName, dir)
    59  	if err != nil {
    60  		log.Fatalf("logging.Setup err: %s", err)
    61  	}
    62  
    63  	mw := io.MultiWriter(os.Stdout, logFile)
    64  	logger = log.New(mw, defaultPrefix, flags)
    65  }
    66  
    67  func setPrefix(level logLevel) {
    68  	_, file, line, ok := runtime.Caller(defaultCallerDepth)
    69  	if ok {
    70  		logPrefix = fmt.Sprintf("[%s][%s:%d] ", levelFlags[level], filepath.Base(file), line)
    71  	} else {
    72  		logPrefix = fmt.Sprintf("[%s] ", levelFlags[level])
    73  	}
    74  
    75  	logger.SetPrefix(logPrefix)
    76  }
    77  
    78  // Debug prints debug log
    79  func Debug(v ...interface{}) {
    80  	mu.Lock()
    81  	defer mu.Unlock()
    82  	setPrefix(DEBUG)
    83  	logger.Println(v...)
    84  }
    85  
    86  // Info prints normal log
    87  func Info(v ...interface{}) {
    88  	mu.Lock()
    89  	defer mu.Unlock()
    90  	setPrefix(INFO)
    91  	logger.Println(v...)
    92  }
    93  
    94  // Warn prints warning log
    95  func Warn(v ...interface{}) {
    96  	mu.Lock()
    97  	defer mu.Unlock()
    98  	setPrefix(WARNING)
    99  	logger.Println(v...)
   100  }
   101  
   102  // Error prints error log
   103  func Error(v ...interface{}) {
   104  	mu.Lock()
   105  	defer mu.Unlock()
   106  	setPrefix(ERROR)
   107  	logger.Println(v...)
   108  }
   109  
   110  func Errorf(format string, v ...interface{}) {
   111  	mu.Lock()
   112  	defer mu.Unlock()
   113  	setPrefix(ERROR)
   114  	logger.Println(fmt.Sprintf(format, v...))
   115  }
   116  
   117  // Fatal prints error log then stop the program
   118  func Fatal(v ...interface{}) {
   119  	mu.Lock()
   120  	defer mu.Unlock()
   121  	setPrefix(FATAL)
   122  	logger.Fatalln(v...)
   123  }