l'éditeur php Strawberry est là pour vous présenter une méthode pour modifier le niveau de journalisation du slog Go lang au moment de l'exécution. Go lang slog est une bibliothèque de journalisation couramment utilisée, mais pendant le développement, nous devrons peut-être modifier le niveau du journal sans redémarrer l'application. Cet article présentera une méthode simple et efficace qui vous permet de modifier facilement le niveau de journalisation au moment de l'exécution pour répondre à différents besoins. Que vous soyez débutant ou développeur expérimenté, cette astuce vous aidera dans vos projets.
En utilisant le package de journalisation de slog Go ("log/slog"
), je recherche un moyen de modifier le niveau de journalisation de l'enregistreur au moment de l'exécution ?
Est-il possible? J'ai passé des heures à jouer avec mais je ne trouve pas de moyen de le faire.
Vous trouverez ci-dessous le code que j'ai écrit sur la base de la réponse de Peter.
Je fais des appels HTTP
http://localhost:8080/changeLogLevel?logger=TCP&level=ERROR
.
package main import ( "log" "log/slog" "net/http" "os" "strings" "time" ) func main() { // Create a LevelVar variable and initialize it to DEBUG. // Create the template logger with info tcpLvl := new(slog.LevelVar) tcpLvl.Set(slog.LevelDebug) dbLvl := new(slog.LevelVar) dbLvl.Set(slog.LevelDebug) mqLvl := new(slog.LevelVar) mqLvl.Set(slog.LevelDebug) tcpLogger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ Level: tcpLvl, })) mqLogger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ Level: mqLvl, })) // Create the MQLogger. dbLogger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ Level: dbLvl, })) // Create a goroutine that prints debug messages to the 3 loggers. go func() { levels := map[string]slog.Level{ "DEBUG": slog.LevelDebug, "WARN": slog.LevelWarn, "INFO": slog.LevelInfo, "ERROR": slog.LevelError, } for { for levelStr, numericLevel := range levels { log.Printf("Is: %s enabled for tcpLogger? %v \n", levelStr, tcpLogger.Enabled(nil, numericLevel)) } dbLogger.Debug("This is a debug message from the DBLogger.") tcpLogger.Debug("This is a debug message from the TCPLogger.") mqLogger.Debug("This is a debug message from the MQLogger.") log.Println("----------------------------------------------------") time.Sleep(10 * time.Second) } }() // Create an HTTP server. http.HandleFunc("/changeLogLevel", func(w http.ResponseWriter, r *http.Request) { // Get the logger name from the request. log.Println("----- Got HTTP call -------") loggerName := r.URL.Query().Get("logger") // Get the new log level from the request. newLogLevelStr := r.URL.Query().Get("level") var level slog.Level log.Printf("Incoming log level is %v\n", newLogLevelStr) switch strings.ToUpper(newLogLevelStr) { case "DEBUG": level = slog.LevelDebug case "WARNING": level = slog.LevelWarn case "ERROR": level = slog.LevelError case "INFO": level = slog.LevelInfo default: { w.WriteHeader(http.StatusBadRequest) w.Write([]byte("Invalid level name")) return } } log.Printf("Incoming logger name is %v\n", loggerName) switch strings.ToUpper(loggerName) { case "DB": dbLvl.Set(level) case "TCP": log.Printf("Going to set the TCP logger level to %v\n", level) tcpLvl.Set(level) case "MQ": mqLvl.Set(level) default: w.WriteHeader(http.StatusBadRequest) w.Write([]byte("Invalid logger name")) return } w.WriteHeader(http.StatusOK) }) // Start the HTTP server. http.ListenAndServe(":8080", nil) }
Le code ci-dessous fonctionne comme prévu.
package main import ( "log" "log/slog" "os" ) func main() { log.Println("slog chaqnge level demo") lvl := new(slog.LevelVar) lvl.Set(slog.LevelInfo) logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ Level: lvl, })) logger.Info("Info msg") logger.Debug("Debug msg - you will NOT see me") lvl.Set(slog.LevelDebug) logger.Debug("Debug msg - you will see me") }
Sortie
2009/11/10 23:00:00 slog chaqnge level demo time=2009-11-10T23:00:00.000Z level=INFO msg="Info msg" time=2009-11-10T23:00:00.000Z level=DEBUG msg="Debug msg - you will see me"
Les constructeurs de gestionnaires intégrés prennent tous le paramètre HandlerOptions. HandlerOptions possède un champ Niveau que vous pouvez utiliser pour modifier le niveau de manière dynamique.
type HandlerOptions struct { // Level reports the minimum record level that will be logged. // The handler discards records with lower levels. // If Level is nil, the handler assumes LevelInfo. // The handler calls Level.Level for each record processed; // to adjust the minimum level dynamically, use a LevelVar. Level Leveler // ... }
Il suffit donc de définir un LevelVar lors de la création de l'enregistreur :
lvl := new(slog.LevelVar) lvl.Set(slog.LevelInfo) logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ Level: lvl, })) // later ... lvl.Set(slog.LevelDebug)
Si vous implémentez votre propre gestionnaire, la méthode Enabled détermine le niveau de journalisation, vous pouvez également facilement utiliser LevelVar :
type MyHandler struct { level slog.Leveler } func (h *MyHandler) Enabled(_ context.Context, level slog.Level) bool { return level >= h.level.Level() }
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!