Der folgende Editor bietet Ihnen eine detaillierte Erklärung der Protokollrotation in Golang. Der Herausgeber findet es ziemlich gut, deshalb werde ich es jetzt mit Ihnen teilen und es allen als Referenz geben. Kommen Sie und schauen Sie sich den Editor an
Betriebssystem: CentOS 6.9_x64
Go-Sprachversion: 1.8.3
Problembeschreibung
Das Protokollmodul von Golang bietet eine Protokollschreibfunktion. Der Beispielcode lautet wie folgt:
/* golang log example */ package main import ( "log" "os" ) func main() { logFile,err := os.Create("test1.log") defer logFile.Close() if err != nil { log.Fatalln("open file error!") } logger := log.New(logFile,"[Debug]",log.Ldate | log.Ltime | log.Lshortfile) logger.Println("test debug message") logger.SetPrefix("[Info]") logger.Println("test info message") }
Betriebseffekt:
[root@local t2]# go build logTest1.go [root@local t2]# ./logTest1 [root@local t2]# cat test1.log [Debug]2017/06/13 23:18:36 logTest1.go:19: test debug message [Info]2017/06/13 23:18:36 logTest1.go:21: test info message [root@local t2]#
Go-Sprachprotokollmodul Es gibt keine Protokollrotationsschnittstelle, aber wir benötigen diese Funktion in der tatsächlichen Entwicklung:
Wir möchten nicht, dass ein einzelnes Protokoll zu groß ist, da der Texteditor es sonst nicht öffnen kann und es schwierig ist, es anzuzeigen ;
Wir möchten nicht, dass es mehr Speicherplatz beansprucht. Wenn der Speicherplatz zu groß ist, können Sie die maximale Anzahl der zu speichernden Protokolldateien angeben.
Lösung
Erreicht mit Hilfe gepufferter Kanäle.
Der Beispielcode lautet wie folgt:
/* golang log rotate example */ package main import ( "fmt" "log" "os" "time" ) const ( BACKUP_COUNT = 5 MAX_FILE_BYTES = 2 * 1024 ) func doRotate(fPrefix string) { for j := BACKUP_COUNT; j >= 1; j-- { curFileName := fmt.Sprintf("%s_%d.log",fPrefix,j) k := j-1 preFileName := fmt.Sprintf("%s_%d.log",fPrefix,k) if k == 0 { preFileName = fmt.Sprintf("%s.log", fPrefix) } _,err := os.Stat(curFileName) if err == nil { os.Remove(curFileName) fmt.Println("remove : ", curFileName) } _,err = os.Stat(preFileName) if err == nil { fmt.Println("rename : ", preFileName, " => ", curFileName) err = os.Rename(preFileName, curFileName) if err != nil { fmt.Println(err) } } } } func NewLogger(fPrefix string) (*log.Logger, *os.File) { var logger *log.Logger fileName := fmt.Sprintf("%s.log", fPrefix) fmt.Println("fileName :", fileName) logFile, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { fmt.Println("open file error!") } else { logger = log.New(logFile, "[Debug]", log.Ldate|log.Ltime|log.Lshortfile) } return logger, logFile } func logWorker(msgQueue <-chan string) { fPrefix := "msg" logger, logFile := NewLogger(fPrefix) for msg := range msgQueue { logger.Println(msg) fi, err2 := logFile.Stat() if err2 == nil { if fi.Size() > MAX_FILE_BYTES { logFile.Close() doRotate(fPrefix) logger,logFile = NewLogger(fPrefix) } } } logFile.Close() } func main() { msgQueue := make(chan string, 1000) go logWorker(msgQueue) for j := 1; j <= 1000; j++ { msgQueue <- fmt.Sprintf("msg_%d", j) time.Sleep(1 * time.Second) } close(msgQueue) return }
Der Laufeffekt ist wie folgt:
[root@local t2]# ./logRotateTest1 fileName : msg.log rename : msg.log => msg_1.log fileName : msg.log rename : msg_1.log => msg_2.log rename : msg.log => msg_1.log fileName : msg.log rename : msg_2.log => msg_3.log rename : msg_1.log => msg_2.log rename : msg.log => msg_1.log fileName : msg.log ^C
Diskussion
Dies ist nur ein einfacher Beispielcode, der die Protokollrotation implementiert. Weitere Funktionen müssen selbst entwickelt werden.
Okay, das ist es, ich hoffe, es hilft.
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in das Protokollmodul in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!