Journal de bord du projet go [11e mise à jour du projet de la Décennie open source]

Communauté chinoise de golang 2022-05-14 12:59:53 阅读数:981

journalbordduprojet11e
Une dérive profonde10Les programmeurs de l'année sont déterminés à utiliser l'avenir10Année pour maintenir un projet,La fonction de ce projet n'est pas définie,Faites ce que vous voulez,Écrivez ce que vous rencontrez.Son objectif principal est double,Pour approfondir sa profondeur technologique,Ii) Fournir des références à d'autres apprenants.Si vous êtes intéressé, suivez - moi dans ce projet,Pas de frais、Non, la routine.、Il y a de vrais sentiments dans le monde.Remarques:Le code utilisé dans les projets précédents a été partagé avecGitHubC'est parti.,Et le Code qui apparaîtra dans tous les projets à l'avenir sera soumis,Bienvenue à.Adresse:https://github.com/kaiyuan10nian/kaiyuan10nian Si vous êtes intéressé, vous pouvez commanderstarOh, mon Dieu.~La mise à jour du projet de la Décennie open source a été publiée pour la première fois sous le numéro public:Plate - forme d'auto - apprentissage informatique,Les petits partenaires intéressés peuvent continuer à prêter attention,Et je vous souhaite la bienvenue sur WeChat(kaiyuan10nian)Suivez - moi pour terminer et faire avancer le projet.---Aïe!,L'intervalle de mise à jour est un peu long,C'est faux, les gars qui me soutiennent.,L'entreprise vient de lancer un nouveau projet,Le temps presse.,Merci beaucoup..Voici le texte de partage d'aujourd'hui.**GoJournal de bord du projet**Une des choses que vous entendez souvent dans le Département technique d'une entreprise est:“Un instant,Laissez - moi vérifier.**Log**Je te rappelle..”Log---En fait, c'est ce que le projet a laissé en cours d'exécution..C'est comme si tu battais un lapin en hiver.,La première chose à faire est de chercher les traces de pas laissées par les lapins dans la neige., Puis suivez les traces de pas pour trouver le nid du lapin , Et finalement, je suis revenu plein . Il en va de même pour le développement de projets. , Vous devez faire tout ce qui est en votre pouvoir pendant l'élaboration du projet pour que la logique d'entreprise laisse plus d'information critique pendant l'exécution. , Cela laisse une trace de l'exécution du projet une fois qu'il fonctionne correctement. , Vous pouvez rapidement trouver la source du problème à travers cette trace , Pour se débarrasser de .EtGo Une seule bibliothèque standard est disponible dans la langue log. Utilisation sans installation , C'est une très petite bibliothèque de journaux ,Tout le monde peut y aller un moment..log Seulement trois interfaces simples sont disponibles , C'est un peu trop pour certains grands projets , Donc ce que je vais vous présenter dans cet article n'est pas log Mais son frère logrus.logrus Est entièrement compatible logBibliothèque standard pour,En ce momentGitHub C'est trop 20K starsC'est. Il supporte deux formats de sortie de journaux :Texte And JSON C'est génial pour les projets qui veulent plus d'analyse de données à travers les journaux . Ce titre est divisé en deux parties :- 1、logrusIntroduction à l'utilisation de base de- 2、EncapsulationlogrusPour**La Décennie des sources ouvertes**Dans le projet​ 2.1)À propos de l'utilisationlumberjackC'est exact.logrus Les journaux générés sont sous - traités 1、logrusIntroduction à l'utilisation de base de1)Installation```gogo get -u github.com/sirupsen/logrus```2) Définir le niveau de sortie du Journal ​ Les vieux programmeurs savent , Le cycle complet de développement d'un projet se déroule en plusieurs étapes. , Nous avons donc besoin de différentes informations de log à différents stades .Donc il est utilisélogrus Nous devons définir le niveau de sortie du Journal , Pour filtrer le contenu de l'information dont nous avons besoin .​ Avant de définir le niveau de sortie du Journal ,Nous devons comprendrelogrus Plusieurs niveaux sont distingués ?| Niveau | Grade | Explication || ---- | ----------------- | ---------------------------------------------------- || 1 | logrus.TraceLevel | Informations de très petite taille || 2 | logrus.DebusLevel | Informations de débogage sorties dans le programme général || 3 | logrus.InfoLevel | Opérations critiques( Journal des processus de base ) || 4 | logrus.WarnLevel | Messages d'avertissement || 5 | logrus.ErrorLevel | Message d'erreur || 6 | logrus.FatalLevel | Erreur fatale, Le programme ne peut pas fonctionner après l'événement , Arrêt du programme après la date de sortie || 7 | logrus.PanicLevel | Journal de bord,Et puispanic | Il y en a un à gauche. **Niveau** Gardez l'ordre. ,Parce quelogrusMoyenne, Les journaux au - dessus du niveau de réglage ne sont pas exportés ,Le niveau par défaut estInfoLevelExemple:```gologrus.SetLevel(logrus.TraceLevel)logrus.Trace("1---trace---msg")logrus.Debug("2---debug---msg")logrus.Info("3---info---msg")logrus.Warn("4---warn---msg")logrus.Error("5---error---msg")logrus.Fatal("6---fatal---msg")logrus.Panic("7---panic---msg")``` Après l'exécution, regardons la sortie du Journal :```goTRAC[0000] 1---trace---msg DEBU[0000] 2---debug---msg INFO[0000] 3---info---msg WARN[0000] 4---warn---msg ERRO[0000] 5---error---msg FATA[0000] 6---fatal---msg ``` Si, dans le code ci - dessus, nous mettons :```gologrus.SetLevel(logrus.TraceLevel)```Modifier comme suit::```gologrus.SetLevel(logrus.InfoLevel)```Et puis, Exécuter à nouveau pour voir la sortie :```goINFO[0000] 3---info---msg WARN[0000] 4---warn---msg ERRO[0000] 5---error---msg FATA[0000] 6---fatal---msg ```Je vois.,Queinfo Le niveau inférieur ne produit plus .3) Exporter des fichiers spécifiques et des emplacements de fonctions dans le journal pour localiser rapidement la source du problème , La plupart du temps, nous sortons les chemins de fichiers et les fonctions directement pendant la phase de débogage , Pour qu'on n'ait plus besoin de localiser et de chercher , L'efficacité de la résolution des problèmes sera grandement améliorée .logrus Configuration spéciale disponible , Il suffit d'initialiser logrusAppelé quandSetReportCaller() La fonction est définie à trueC'est tout..Exemple:```go logrus.SetReportCaller(true) logrus.Info("3---info---msg")```Exécution directe pour voir l'effet:```goINFO[0000]/Users/fu/GolandProjects/logrusDemo/main.go:29 main.main() 3---info---msg ```4) Ajouter des informations supplémentaires en tant que développeurs d'arrière - plan , C'est instinctif de toujours garder à l'esprit la question de la concurrence . Donc, lors de l'enregistrement , Vous pourriez aussi réfléchir à la façon de distinguer les journaux .Par exemple,: Quels journaux ont été laissés par Zhang San? ? Quels journaux ont été laissés par Li Si? ? Pourquoi le même flux logique produit - il des résultats différents de ceux de Zhang San et Li Si? ? À ce moment - là, vous vous demandez peut - être , Si je mets ces journaux “Zhang San”“Li - si.” C'est plus facile à trouver. ?logrusOffre une solution,C'estWithFieldEtWithFields , Autoriser l'ajout de certains champs à la sortie ,Par exemple,:```gologrus.WithFields(logrus.Fields{ "UUID": "12345678", }).Info("info msg")```Sortie du Journal:```goINFO[0000] 3---info---msg UUID=12345678``` Il s'agit d'une utilisation individuelle , Mieux vaut l'utiliser en vrac :```gorequestLogger := logrus.WithFields(logrus.Fields{ "UUID": "12345678", })requestLogger.Info("3---info---msg")requestLogger.Error("5---error---msg")```Sortie du Journal:```goINFO[0000] 3---info---msg UUID=12345678ERRO[0000] 5---error---msg UUID=12345678```5)JSON Format Output log nous utilisons le format de sortie par défaut lors de la sortie de log , C'est - à - dire le format de texte . Mais dans de nombreuses entreprises, les données sources sur lesquelles nous nous appuyons pour effectuer des statistiques ou des analyses de données sont des journaux. , S'il s'agit d'un format de texte, il n'est pas facile à utiliser. ,Remplacer parjson Est - ce que le format apporte beaucoup de commodité ?logrusDifférent delog La plus grande partie de jsonFormat de sortie, Il suffit de définir au moment de l'initialisation SetFormatterC'est tout..```go logrus.SetLevel(logrus.TraceLevel) logrus.SetFormatter(&logrus.JSONFormatter{}) logrus.Trace("1---trace---msg") logrus.Debug("2---debug---msg") logrus.Info("3---info---msg") logrus.Warn("4---warn---msg") logrus.Error("5---error---msg") logrus.Fatal("6---fatal---msg") logrus.Panic("7---panic---msg")```Suivez - moi.1) Comme dans l'exemple ,J'ai juste ajoutélogrus.SetFormatter(&logrus.JSONFormatter{}), Maintenant regardons le format de sortie :```go{"level":"trace","msg":"1---trace---msg","time":"2022-05-14T11:37:56+08:00"}{"level":"debug","msg":"2---debug---msg","time":"2022-05-14T11:37:56+08:00"}{"level":"info","msg":"3---info---msg","time":"2022-05-14T11:37:56+08:00"}{"level":"warning","msg":"4---warn---msg","time":"2022-05-14T11:37:56+08:00"}{"level":"error","msg":"5---error---msg","time":"2022-05-14T11:37:56+08:00"}{"level":"fatal","msg":"6---fatal---msg","time":"2022-05-14T11:37:56+08:00"}```ok,Par ici.logrus Nous avons compris le fonctionnement de base de , Voici comment l'utiliser systématiquement dans un projet de dix ans Open Source .2、EncapsulationlogrusPour**La Décennie des sources ouvertes** J'en ai emballé un. logger.goDocuments,C'est parti.configSous la table des matières, Je vais mettre tout le Code , Ensuite, expliquez - les un par un dans les notes .```gopackage configimport ( "github.com/gin-gonic/gin" "github.com/natefinch/lumberjack" "github.com/sirupsen/logrus" "path" "time")var logger *logrus.Logger//Nom du Journalconst ( //Nom du fichier journal LOG_NAME = "kaiyuanshinian" //Suffixe du fichier journal LOG_SUFFIX = ".log" //Taille du fichier journal unique,UnitéMB LOG_SIZE = 50 //Nombre de fichiers journaux LOG_BACKUP = 10 // Nombre maximum de jours pour les fichiers journaux LOG_DATE = 7)//Définir la sortie du Journal vers le fichierfunc setOutPut(log *logrus.Logger, log_file_path string) { logconf := &lumberjack.Logger{ Filename: log_file_path, MaxSize: LOG_SIZE, // Taille du fichier journal,Unités MB MaxBackups: LOG_BACKUP, // Nombre maximum de journaux expirés conservés MaxAge: LOG_DATE, // Durée maximale de conservation des fichiers expirés,Unité Oh, mon Dieu. Compress: true, // Compresser le journal ou non ,La valeur par défaut n'est pas compressée.C'est réglé àtrue,Compresser le journal } log.SetOutput(logconf)}//Initialisation du module Journalfunc InitLogger() { log_file_path := path.Join("./", LOG_NAME+LOG_SUFFIX) logger = logrus.New() setOutPut(logger, log_file_path) logger.SetLevel(logrus.DebugLevel) logger.SetFormatter(&logrus.JSONFormatter{ TimestampFormat: "2006-01-02 15:04:05", })}//AccèslogrusOpérandefunc GetLogger() *logrus.Logger { return logger}//gin Le message de demande est également écrit dans le journal func LoggerToFile() gin.HandlerFunc { return func(c *gin.Context) { startTime := time.Now() // Heure de début c.Next() // Traitement des demandes endTime := time.Now() // Fin de l'heure latencyTime := endTime.Sub(startTime) // Temps d'exécution reqMethod := c.Request.Method // Mode de demande reqUri := c.Request.RequestURI // Demande de routage statusCode := c.Writer.Status() // Code d'état clientIP := c.ClientIP() // DemandeIP logger.Infof("| %3d | %13v | %15s | %s | %s", statusCode, latencyTime, clientIP, reqMethod, reqUri ) // Format du Journal }}```C'est vrai.logrusLe paquet de, Tout le monde aurait dû voir ça. ,Comment l'utiliser??(Il n'y a quelumberjack C'est quelque chose que nous n'avons pas mentionné auparavant. ,Expliquez ci - dessous.)1) L'initialisation met directement logrus L'initialisation de ```gofunc InitConfig() { config.InitLogger()//Initialisationlogrus viper.SetConfigName("application") viper.SetConfigType("yml") viper.AddConfigPath("./config/") err := viper.ReadInConfig() if err != nil { panic(""+err.Error()) }}```2) Plus facile à utiliser , Il suffit d'appeler directement à l'endroit requis par le projet .2.1)routeUtilisation dans```gofunc CollectRoute(r *gin.Engine) *gin.Engine { r.Use(config.LoggerToFile())//Ajouter une journalisation r.POST("/v1/account/register", controller.Register) ...//Code omis, C'est écrit avant ,Il y a return r}```2.2) Utilisation dans la logique ```goconfig.GetLogger().Debugf("aaaaa")```3)lumberjack Il y a quelque chose de nouveau dans le Code encapsulé. lumberjack, À quoi sert - il? ?C'est exact., Pour couper un fichier journal . Parfois, nos journaux ont besoin de beaucoup d'informations. , Si tout est enregistré dans un seul fichier , S'il arrive quelque chose d'indéfinissable et que les papiers sont perdus, on ne peut que pleurer. . Donc l'un est pour la sécurité , Deuxièmement, pour plus de commodité , Nous allons diviser les fichiers journaux pour enregistrer .```gologconf := &lumberjack.Logger{ Filename: log_file_path, MaxSize: LOG_SIZE, // Taille du fichier journal,Unités MB MaxBackups: LOG_BACKUP, // Nombre maximum de journaux expirés conservés MaxAge: LOG_DATE, // Durée maximale de conservation des fichiers expirés,Unité Oh, mon Dieu. Compress: true, // Compresser le journal ou non ,La valeur par défaut n'est pas compressée.C'est réglé àtrue,Compresser le journal } log.SetOutput(logconf)```Son utilisation est très simple,Définir les paramètres,InSetoutPut Ça ira. , Lorsque le fichier est plus grand que ce que nous avons défini MaxSizeHeure, L'enregistrement fractionné est effectué automatiquement .ok ,just this...C'est tout pour aujourd'hui.. Merci pour votre soutien. ~
Copyright:Cet article est[Communauté chinoise de golang]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2022/134/202205141252132918.html