這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go封裝日誌:
- 支援歸檔輸出,一個小時壓縮歸檔一份
- 最多保留三天的日誌
- 支援記錄層級自訂
- 如果沒有指定輸出檔案預設輸出到控制台。
- 支援輸出檔案名行號,以及時間、日誌界別
如: info 10:08:40.826836 handler.go:81
package loggerimport ( "fmt" "log" "os" "os/exec" "strings" "time")const ( PanicLevel int = iota FatalLevel ErrorLevel WarnLevel InfoLevel DebugLevel)type LogFile struct { level int logTime int64 fileName string fileFd *os.File}var logFile LogFilefunc Config(logFolder string, level int) { logFile.fileName = logFolder logFile.level = level log.SetOutput(logFile) log.SetFlags(log.Lmicroseconds | log.Lshortfile)}func SetLevel(level int) { logFile.level = level}func Debugf(format string, args ...interface{}) { if logFile.level >= DebugLevel { log.SetPrefix("debug ") log.Output(2, fmt.Sprintf(format, args...)) }}func Infof(format string, args ...interface{}) { if logFile.level >= InfoLevel { log.SetPrefix("info ") log.Output(2, fmt.Sprintf(format, args...)) }}func Warnf(format string, args ...interface{}) { if logFile.level >= WarnLevel { log.SetPrefix("warn ") log.Output(2, fmt.Sprintf(format, args...)) }}func Errorf(format string, args ...interface{}) { if logFile.level >= ErrorLevel { log.SetPrefix("error ") log.Output(2, fmt.Sprintf(format, args...)) }}func Fatalf(format string, args ...interface{}) { if logFile.level >= FatalLevel { log.SetPrefix("fatal ") log.Output(2, fmt.Sprintf(format, args...)) }}func (me LogFile) Write(buf []byte) (n int, err error) { if me.fileName == "" { fmt.Printf("consol: %s", buf) return len(buf), nil } if logFile.logTime+3600 < time.Now().Unix() { logFile.createLogFile() logFile.logTime = time.Now().Unix() } if logFile.fileFd == nil { return len(buf), nil } return logFile.fileFd.Write(buf)}func (me *LogFile) createLogFile() { logdir := "./" 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%02d", me.fileName, now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute()) if err := os.Rename(me.fileName, filename); err == nil { go func() { tarCmd := exec.Command("tar", "-zcf", filename+".tar.gz", filename, "--remove-files") tarCmd.Run() rmCmd := exec.Command("/bin/sh", "-c", "find "+logdir+` -type f -mtime +2 -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, os.ModeExclusive); nil == err { me.fileFd.Sync() me.fileFd.Close() me.fileFd = fd break } me.fileFd = nil }}