editor php Strawberry di sini untuk memperkenalkan kepada anda kaedah untuk menukar tahap log slog Go lang pada masa jalan. Go lang slog ialah perpustakaan pengelogan yang biasa digunakan, tetapi semasa pembangunan, kita mungkin perlu menukar tahap log tanpa memulakan semula aplikasi. Artikel ini akan memperkenalkan kaedah mudah dan berkesan yang membolehkan anda menukar tahap log dengan mudah pada masa jalan untuk memenuhi keperluan yang berbeza. Sama ada anda seorang pemula atau pembangun yang berpengalaman, petua ini akan membantu projek anda.
Menggunakan pakej pengelogan slog Go ("log/slog"
), saya sedang mencari cara untuk menukar tahap log pembalak semasa masa jalan?
Adakah mungkin? Saya telah menghabiskan masa berjam-jam bermain dengannya tetapi tidak dapat mencari cara untuk melakukannya.
Di bawah adalah kod yang saya tulis berdasarkan jawapan Peter.
Saya membuat panggilan 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) }
Kod di bawah berfungsi seperti yang diharapkan.
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") }
Output
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"
Pembina pengendali terbina dalam semuanya mengambil parameter HandlerOptions. HandlerOptions mempunyai medan Tahap yang boleh anda gunakan untuk menukar tahap secara dinamik.
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 // ... }
Jadi cuma tetapkan LevelVar semasa mencipta logger:
lvl := new(slog.LevelVar) lvl.Set(slog.LevelInfo) logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ Level: lvl, })) // later ... lvl.Set(slog.LevelDebug)
Jika anda melaksanakan pengendali anda sendiri, kaedah Didayakan menentukan tahap log, anda juga boleh menggunakan LevelVar dengan mudah:
type MyHandler struct { level slog.Leveler } func (h *MyHandler) Enabled(_ context.Context, level slog.Level) bool { return level >= h.level.Level() }
Atas ialah kandungan terperinci Tukar tahap log slog Go lang pada masa jalan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!