php小编草莓在这里为大家介绍一种在运行时更改 Go lang slog 的日志级别的方法。Go lang slog 是一个常用的日志记录库,但在开发过程中,我们可能需要在不重启应用程序的情况下更改日志的级别。本文将介绍一种简单有效的方法,让您在运行时轻松地更改日志级别,以满足不同的需求。无论您是初学者还是有经验的开发者,这个技巧都将对您的项目有所帮助。
问题内容
使用 Go slog 日志记录包("log/slog"
),我正在寻找一种在运行时更改记录器日志级别的方法?
是否可以? 我花了几个小时玩它,但找不到办法做到这一点。
更新 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"
解决方法
内置处理程序的构造函数都采用 HandlerOptions 参数。 HandlerOptions 有一个 Level 字段,您可以使用它动态更改级别。
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
// ...
}
因此,只需在创建记录器时设置一个 LevelVar 即可:
lvl := new(slog.LevelVar)
lvl.Set(slog.LevelInfo)
logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
Level: lvl,
}))
// later ...
lvl.Set(slog.LevelDebug)
如果您正在实现自己的处理程序,则 Enabled 方法确定日志级别,您也可以轻松地使用 LevelVar:
type MyHandler struct {
level slog.Leveler
}
func (h *MyHandler) Enabled(_ context.Context, level slog.Level) bool {
return level >= h.level.Level()
}
以上就是在运行时更改 Go lang slog 的日志级别的详细内容,更多请关注编程网其它相关文章!