L'éditeur suivant vous apportera une explication détaillée de la rotation des journaux dans Golang. L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Venez jeter un œil avec l'éditeur
Système d'exploitation : CentOS 6.9_x64
version linguistique go : 1.8.3
Description du problème
Le module de journalisation de Golang fournit une fonction d'écriture de journal. L'exemple de code est le suivant :
/* 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") }
Effet de fonctionnement :
[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]#
Module de journalisation de langue Go. Aucune interface de rotation de journal n'est fournie, mais nous avons besoin de cette fonction dans le développement réel :
Nous ne voulons pas qu'un seul journal soit trop volumineux, sinon l'éditeur de texte ne pourra pas l'ouvrir et il sera difficile à visualiser ;
Nous ne voulons pas qu'il occupe plus d'espace. Si l'espace de stockage est trop grand, vous pouvez spécifier le nombre maximum de fichiers journaux à stocker.
Solution
Obtenue à l'aide de canaux tamponnés.
L'exemple de code est le suivant :
/* 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 }
L'effet de course est le suivant :
[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
Discussion
Ceci est juste un simple exemple de code qui implémente la rotation des journaux. D'autres fonctions doivent être développées par vous-même.
D'accord, c'est tout, j'espère que ça aide.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!