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()