ホームページ  >  記事  >  バックエンド開発  >  実行時に Go lang slog のログ レベルを変更する

実行時に Go lang slog のログ レベルを変更する

王林
王林転載
2024-02-09 10:18:08336ブラウズ

在运行时更改 Go lang slog 的日志级别

phpエディタStrawberryでは、Go lang slogのログレベルを実行時に変更する方法を紹介します。 Go lang slog は一般的に使用されるログ ライブラリですが、開発中にアプリケーションを再起動せずにログのレベルを変更する必要がある場合があります。この記事では、さまざまなニーズに合わせて実行時にログ レベルを簡単に変更できる、シンプルで効果的な方法を紹介します。初心者でも経験豊富な開発者でも、このヒントはプロジェクトに役立ちます。

質問の内容

Go slog ロギング パッケージ ("log/slog") を使用して、実行時にロガーのログ レベルを変更する方法を探しています。

出来ますか? 何時間も遊んでみましたが、これを行う方法が見つかりません。

更新 1 - 3 つのロガーでアプリを実行し、HTTP を使用してレベルを変更する

以下は、Peter の回答に基づいて作成したコードです。 HTTP 呼び出しを行う http://localhost:8080/changeLogLevel?logger=TCP&level=ERROR

リーリー

更新 2 - 基本的な例

以下のコードは期待どおりに機能します。

リーリー ###出力###
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)
}

Solution

組み込みハンドラーのコンストラクターはすべて、HandlerOptions パラメーターを受け取ります。 HandlerOptions には、レベルを動的に変更するために使用できる Level フィールドがあります。

リーリー

したがって、ロガーを作成するときに LevelVar を設定するだけです:

リーリー

独自のハンドラーを実装している場合、Enabled メソッドによってログ レベルが決定され、LevelVar を簡単に使用することもできます。 リーリー

以上が実行時に Go lang slog のログ レベルを変更するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。