package logger import ( "fmt" "log" "os" "os/exec" "strings" "time" ) const ( PanicLevel int = iota FatalLevel ErrorLevel WarnLevel InfoLevel DebugLevel ) const ( color_red = uint8(iota + 91) color_green // 绿 color_yellow // 黄 color_blue // 蓝 color_magenta // 洋红 ) const ( fatalPrefix = "[FATAL] " errorPrefix = "[ERROR] " warnPrefix = "[WARN] " infoPrefix = "[INFO] " debugPrefix = "[DEBUG] " ) const ( ByDay int = iota ByWeek ByMonth BySize ) type LogFile struct { level int // 日志等级 saveMode int // 保存模式 saveDays int // 日志保存天数 logTime int64 // fileName string // 日志文件名 filesize int64 // 文件大小, 需要设置 saveMode 为 BySize 生效 fileFd *os.File } var logFile LogFile func init() { //logFile.logTime = time.Now().Unix() logFile.saveMode = ByDay // 默认按天保存 logFile.saveDays = 15 // 默认保存三天的 logFile.level = ErrorLevel logFile.filesize = 1024 * 1024 * 10 // 默认10M, 需要设置 saveMode 为 BySize } func Config(logFolder string, level int) { logFile.fileName = logFolder logFile.level = level log.SetOutput(logFile) //log.SetFlags(log.Lmicroseconds | log.Lshortfile) log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) } func GetLogFile() (*LogFile) { return &logFile } func SetLevel(level int) { logFile.level = level } func SetSaveMode(saveMode int) { logFile.saveMode = saveMode } func SetSaveDays(saveDays int) { logFile.saveDays = saveDays } func SetSaveSize(saveSize int64) { logFile.filesize = saveSize } func Debug(args ...interface{}) { if logFile.level >= DebugLevel { log.SetPrefix(blue(debugPrefix)) _ = log.Output(2, fmt.Sprintln(args...)) } } func Info(args ...interface{}) { if logFile.level >= InfoLevel { log.SetPrefix(green(infoPrefix)) _ = log.Output(2, fmt.Sprintln(args...)) } } func Warn(args ...interface{}) { if logFile.level >= WarnLevel { log.SetPrefix(magenta(warnPrefix)) _ = log.Output(2, fmt.Sprintln(args...)) } } func Error(args ...interface{}) { if logFile.level >= ErrorLevel { log.SetPrefix(red(errorPrefix)) _ = log.Output(2, fmt.Sprintln(args...)) } } func Fatal(args ...interface{}) { if logFile.level >= FatalLevel { log.SetPrefix(red(fatalPrefix)) _ = log.Output(2, fmt.Sprintln(args...)) } } func GetRedPrefix(s string) string { return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_red, s) } func red(s string) string { return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_red, s) } func green(s string) string { return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_green, s) } func yellow(s string) string { return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_yellow, s) } func blue(s string) string { return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_blue, s) } func magenta(s string) string { return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_magenta, s) } func (me LogFile) Write(buf []byte) (n int, err error) { if me.fileName == "" { fmt.Printf("consol: %s", buf) return len(buf), nil } switch logFile.saveMode { case BySize: fileInfo, err := os.Stat(logFile.fileName) if err != nil { logFile.createLogFile() logFile.logTime = time.Now().Unix() }else { filesize:= fileInfo.Size(); if logFile.fileFd == nil || filesize > logFile.filesize { logFile.createLogFile() logFile.logTime = time.Now().Unix() } } default: // 默认按天 ByDay if logFile.logTime+3600*24 < time.Now().Unix() { logFile.createLogFile() logFile.logTime = time.Now().Unix() } } if logFile.fileFd == nil { fmt.Printf("log fileFd is nil !\n") return len(buf), nil } return logFile.fileFd.Write(buf) } func (me *LogFile) createLogFile() { logdir := "./logger/" if index := strings.LastIndex(me.fileName, "/"); index != -1 { logdir = me.fileName[0:index] + "/" os.MkdirAll(me.fileName[0:index], os.ModePerm) } now := time.Now() filename := fmt.Sprintf("%s_%04d%02d%02d%02d", me.fileName, now.Year(), now.Month(), now.Day(), now.Hour()) if err := os.Rename(me.fileName, filename); err == nil { go func() { filenameTemp := filename + "Temp" tarCmd := exec.Command("tar", "-zcf", filename + ".tar.gz", filenameTemp, "--remove-files") tarCmd.Run() rmSrcCmd := exec.Command("rm", filename) rmSrcCmd.Run() rmCmd := exec.Command("/bin/sh", "-c", "find "+logdir+` -type f -mtime +` +string(logFile.saveDays)+ ` -exec rm {} \;`) rmCmd.Run() }() } for index := 0; index < 10; index++ { if fd, err := os.OpenFile(me.fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666); nil == err { me.fileFd.Sync() me.fileFd.Close() me.fileFd = fd break }else { fmt.Println("Open logfile error! err: ", err.Error()) } me.fileFd = nil } }