package logging import ( "fmt" "io" "log" "os" "path/filepath" "runtime" "time" "tmr-watch/conf/setting" "tmr-watch/pkg/file" "github.com/gin-gonic/gin" ) type Level int var ( F *os.File DefaultPrefix = "" DefaultCallerDepth = 2 DefaultPath string logger *log.Logger logPrefix = "" levelFlags = []string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"} ) const ( DEBUG Level = iota INFO WARNING ERROR FATAL ) func Setup() { var err error filePath := fmt.Sprintf("./%s", getLogFilePath(setting.AppSetting.RuntimeRootPath, setting.AppSetting.LogSavePath)) fileName := getLogFileName(setting.AppSetting.LogSaveName, setting.AppSetting.TimeFormat, setting.AppSetting.LogFileExt) F, err = file.MustOpen(fileName, filePath) if err != nil { log.Fatalf("logging.Setup err: %v", err) } logger = log.New(F, DefaultPrefix, log.LstdFlags) gin.DefaultWriter = io.MultiWriter(F, logger.Writer()) go func() { defer func() { if err := recover(); err != nil { log.Fatalf("logging.recover err: %v", err) } }() tchan := time.Tick(24 * time.Hour) for { select { case <-tchan: F.Close() F, err = file.MustOpen(fileName, filePath) if err != nil { log.Fatalf("logging.Setup err: %v", err) } logger = log.New(F, DefaultPrefix, log.LstdFlags) gin.DefaultWriter = io.MultiWriter(F, logger.Writer()) } } }() } func Printf(format string, v ...interface{}) { setPrefix(INFO) logger.Printf(format, v) } func Println(v ...interface{}) { setPrefix(INFO) logger.Println(v) } 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) } 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) }