Using Go slog logging package ("log/slog"
), I am looking for a way to change the log level of a logger during runtime?
Is it possible?
I spent few hours playing with it but found no way to do that.
更新1-使用3个记录器运行应用程序并使用HTTP更改级别
下面是我根据Peter的答案编写的代码.
我做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)
}
更新2-基本示例
下面的代码按预期工作.
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")
}
输出
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"