github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/catgo/cat-go/cat/logger.go (about) 1 package cat 2 3 import ( 4 "fmt" 5 "io" 6 "log" 7 "os" 8 "sync" 9 "time" 10 ) 11 12 type Logger struct { 13 logger ILogger 14 mu sync.Mutex 15 currentDay int 16 } 17 18 func createLogger() *Logger { 19 now := time.Now() 20 21 var writer = getWriterByTime(now) 22 23 return &Logger{ 24 logger: log.New(writer, "", log.LstdFlags), 25 mu: sync.Mutex{}, 26 currentDay: now.Day(), 27 } 28 } 29 30 func openLoggerFile(time time.Time) (*os.File, error) { 31 year, month, day := time.Date() 32 filename := fmt.Sprintf("%s/cat_%d_%02d_%02d.log", defaultLogDir, year, month, day) 33 return os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) 34 } 35 36 func getWriterByTime(time time.Time) io.Writer { 37 if file, err := openLoggerFile(time); err != nil { 38 39 // log.Printf("Cannot open log file, logs will be redirected to stdout : %v", err) 40 return os.Stdout 41 } else { 42 log.Printf("Log has been redirected to the file: %s", file.Name()) 43 return file 44 } 45 } 46 47 func (l *Logger) switchLogFile(time time.Time) { 48 l.mu.Lock() 49 defer l.mu.Unlock() 50 51 if l.currentDay == time.Day() { 52 return 53 } 54 55 l.logger.SetOutput(getWriterByTime(time)) 56 } 57 58 func (l *Logger) write(prefix, format string, args ...interface{}) { 59 now := time.Now() 60 61 if now.Day() != l.currentDay { 62 l.switchLogFile(now) 63 } 64 l.logger.Printf(prefix+" "+format, args...) 65 } 66 67 func (l *Logger) Debug(format string, args ...interface{}) { 68 l.write("[Debug]", format, args...) 69 } 70 71 func (l *Logger) Info(format string, args ...interface{}) { 72 l.write("[Info]", format, args...) 73 } 74 75 func (l *Logger) Warning(format string, args ...interface{}) { 76 l.write("[Warning]", format, args...) 77 } 78 79 func (l *Logger) Error(format string, args ...interface{}) { 80 l.write("[Error]", format, args...) 81 } 82 83 type ILogger interface { 84 Printf(format string, args ...interface{}) 85 SetOutput(io.Writer) 86 } 87 88 var logger = createLogger()