package logger import ( "fmt" "github.com/hdt3213/godis/lib/files" "io" "log" "os" "path/filepath" "runtime" "time" ) type Settings struct { Path string `yaml:"path"` Name string `yaml:"name"` Ext string `yaml:"ext"` TimeFormat string `yaml:"time-format"` } var ( F *os.File DefaultPrefix = "" DefaultCallerDepth = 2 logger *log.Logger logPrefix = "" levelFlags = []string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"} ) type Level int const ( DEBUG Level = iota INFO WARNING ERROR FATAL ) const flags = log.LstdFlags func init() { logger = log.New(os.Stdout, DefaultPrefix, flags) } func Setup(settings *Settings) { var err error dir := settings.Path fileName := fmt.Sprintf("%s-%s.%s", settings.Name, time.Now().Format(settings.TimeFormat), settings.Ext) logFile, err := files.MustOpen(fileName, dir) if err != nil { log.Fatalf("logging.Setup err: %s", err) } mw := io.MultiWriter(os.Stdout, logFile) logger = log.New(mw, DefaultPrefix, flags) } func setPrefix(level Level) { _, file, line, ok := runtime.Caller(DefaultCallerDepth) if ok { logPrefix = fmt.Sprintf("[%s][%s:%d] ", levelFlags[level], filepath.Base(file), line) } else { logPrefix = fmt.Sprintf("[%s] ", levelFlags[level]) } logger.SetPrefix(logPrefix) } func Debug(v ...interface{}) { setPrefix(DEBUG) logger.Println(v...) } func Info(v ...interface{}) { setPrefix(INFO) logger.Println(v...) } func Warn(v ...interface{}) { setPrefix(WARNING) logger.Println(v...) } func Error(v ...interface{}) { setPrefix(ERROR) logger.Println(v...) } func Fatal(v ...interface{}) { setPrefix(FATAL) logger.Fatalln(v...) }