


Modifier le niveau de journalisation du slog Go Lang au moment de l'exécution
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.
Contenu de la question
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.
Mise à jour 1 - Exécution d'une application avec 3 enregistreurs et changements de niveaux via HTTP
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) }
Mise à jour 2 - Exemple de base
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"
Solution
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

OpenSSL, en tant que bibliothèque open source largement utilisée dans les communications sécurisées, fournit des algorithmes de chiffrement, des clés et des fonctions de gestion des certificats. Cependant, il existe des vulnérabilités de sécurité connues dans sa version historique, dont certaines sont extrêmement nocives. Cet article se concentrera sur les vulnérabilités et les mesures de réponse communes pour OpenSSL dans Debian Systems. DebianopenSSL CONNUTS Vulnérabilités: OpenSSL a connu plusieurs vulnérabilités graves, telles que: la vulnérabilité des saignements cardiaques (CVE-2014-0160): cette vulnérabilité affecte OpenSSL 1.0.1 à 1.0.1F et 1.0.2 à 1.0.2 Versions bêta. Un attaquant peut utiliser cette vulnérabilité à des informations sensibles en lecture non autorisées sur le serveur, y compris les clés de chiffrement, etc.

L'article explique comment utiliser l'outil PPROF pour analyser les performances GO, notamment l'activation du profilage, la collecte de données et l'identification des goulots d'étranglement communs comme le processeur et les problèmes de mémoire. COMMANDE: 159

L'article traite des tests d'unité d'écriture dans GO, couvrant les meilleures pratiques, des techniques de moquerie et des outils pour une gestion efficace des tests.

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Chemin d'apprentissage du backend: le parcours d'exploration du front-end à l'arrière-end en tant que débutant back-end qui se transforme du développement frontal, vous avez déjà la base de Nodejs, ...

L'article discute de la gestion des dépendances des modules GO via Go.mod, couvrant les spécifications, les mises à jour et la résolution des conflits. Il met l'accent sur les meilleures pratiques telles que le versioning sémantique et les mises à jour régulières.

L'article discute de l'utilisation de tests basés sur la table dans GO, une méthode qui utilise un tableau des cas de test pour tester les fonctions avec plusieurs entrées et résultats. Il met en évidence des avantages comme une amélioration de la lisibilité, une duplication réduite, l'évolutivité, la cohérence et un
